Re: [問題] vector<int *> 會有 memory leak 問題嗎?

看板C_and_CPP作者 (十三)時間14年前 (2011/03/10 16:42), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串3/5 (看更多)
如果把12把位置依原po給的圖擺放 0 到 11,各條線上總和要一樣。 以下是我的程式跑出來的結果,由小到大字典排序,共80組。 也不曉得對不對,甚至根本是錯的,我不知道。 total is 80 0 1 4 10 11 3 5 2 6 7 8 9 0 1 4 11 10 2 5 3 7 6 8 9 0 1 6 11 10 3 2 4 5 9 7 8 0 1 7 10 11 2 3 4 5 9 6 8 0 2 4 9 11 1 8 3 7 5 6 10 0 2 7 9 11 1 5 6 4 8 3 10 0 2 7 11 9 3 1 6 4 10 5 8 0 3 1 9 10 4 8 2 6 5 7 11 0 3 2 11 8 4 5 1 9 6 10 7 0 3 6 10 9 1 5 8 4 7 2 11 0 4 2 11 7 1 8 5 9 3 6 10 0 4 3 7 11 2 10 1 8 5 6 9 0 4 3 10 8 2 7 1 11 5 9 6 0 4 3 11 7 6 2 1 8 9 10 5 0 4 6 8 10 3 5 7 2 9 1 11 0 4 6 10 8 5 1 7 2 11 3 9 0 4 8 7 11 2 5 6 3 10 1 9 0 4 9 10 8 2 1 7 5 11 3 6 0 5 1 11 6 2 8 4 10 3 7 9 0 5 2 10 7 1 9 6 8 3 4 11 0 5 4 9 8 6 3 7 1 10 2 11 0 5 4 9 8 7 2 6 1 11 3 10 0 5 7 11 6 3 1 9 4 10 2 8 0 6 1 7 9 3 11 2 8 4 5 10 0 6 1 9 7 2 10 5 8 3 4 11 0 6 2 5 11 7 8 1 3 9 4 10 0 6 2 7 9 8 5 4 1 10 3 11 0 6 2 11 5 1 8 7 9 3 4 10 0 6 3 7 9 1 11 2 10 4 5 8 0 7 1 10 5 2 9 4 11 3 6 8 0 7 1 11 4 2 8 6 10 3 5 9 0 7 2 9 6 1 10 4 11 3 5 8 0 7 3 5 10 6 8 4 2 9 1 11 0 7 3 6 9 8 5 4 1 11 2 10 0 7 6 11 4 3 2 10 5 9 1 8 0 8 1 5 9 6 10 3 4 7 2 11 0 8 2 4 10 5 11 1 6 7 3 9 0 8 2 10 4 3 7 9 6 5 1 11 0 8 4 11 3 2 5 10 7 6 1 9 0 9 1 7 6 3 11 5 8 4 2 10 1 0 5 10 11 3 4 2 6 7 9 8 1 0 5 11 10 2 4 3 7 6 9 8 1 0 6 11 10 3 2 5 4 8 7 9 1 0 7 10 11 2 3 5 4 8 6 9 1 2 3 10 9 5 4 0 8 7 11 6 1 2 4 10 9 0 8 6 7 3 5 11 1 2 7 11 8 0 4 9 5 6 3 10 1 2 10 8 11 0 4 6 5 9 3 7 1 3 5 7 11 0 10 2 9 4 6 8 1 4 3 11 6 0 8 7 9 2 5 10 1 4 11 8 9 0 3 7 6 10 2 5 1 5 2 6 10 3 11 0 9 4 7 8 1 5 3 7 9 2 10 0 11 4 8 6 1 5 3 9 7 0 10 4 11 2 6 8 1 5 4 10 6 0 8 9 7 3 2 11 1 6 3 8 7 0 11 5 10 2 4 9 1 7 3 9 5 0 10 6 11 2 4 8 1 7 5 11 3 0 6 10 9 4 2 8 2 0 4 9 11 3 6 1 7 5 10 8 2 0 4 11 9 1 6 5 7 3 8 10 2 0 7 11 9 1 3 8 4 6 5 10 2 1 3 9 10 4 6 0 8 5 11 7 2 1 5 8 11 0 9 4 7 3 6 10 2 1 5 11 8 0 6 4 10 3 9 7 2 1 7 9 10 0 6 8 4 5 3 11 2 3 6 7 10 0 9 1 11 4 8 5 2 3 6 7 10 1 8 0 11 5 9 4 2 4 3 10 6 0 9 5 11 1 7 8 2 4 3 11 5 0 8 7 10 1 6 9 2 5 3 8 7 0 11 6 9 1 4 10 2 6 3 10 4 0 9 7 11 1 5 8 3 0 4 9 10 1 8 5 6 2 7 11 3 1 5 7 11 2 8 0 9 4 10 6 3 2 4 8 9 0 10 6 7 1 5 11 3 2 7 6 11 0 9 1 10 4 8 5 3 2 7 6 11 1 8 0 10 5 9 4 4 0 5 8 10 2 7 1 9 3 11 6 4 1 6 9 8 0 7 3 11 2 10 5 4 2 5 6 10 0 11 3 9 1 7 8 5 0 7 8 9 1 6 2 10 3 11 4 如果程式和答案是對的,那首位數字只會是 0 到 5,剛好一半。 關鍵在於產生所有排列的方法。 因為我用 dfs 產生所有排列,就可以設定首位數字大於 5 就 return。 原始未更改的我的程式跑了 1 分多鐘,還有很多努力的空間。 資料結構我使用 map 搭配 unsigned long long,用 bit 紀錄解。 花費記憶體似乎不到 5 MB,甚至更低。 參考程式碼:http://nopaste.csie.org/b88fb Bleed ※ 引述《tropical72 (藍影)》之銘言: : 抱歉昨天有點忙,也在想怎麼詳述我的問題,雖最後硬爆完成, : 但為避免日後遇到類似問題,還是整理一下向各位先進請教,請各位先進不吝解惑。 : 我換了另一個相似之例子出來引出問題 : 聲明,這問題我想問的是 技巧、演算法(目前是用窮舉法,效率太差了)、資料結構方面。 : 所有各位版友有意見、經驗盡管提出供小弟做參考。 : (1) 問題述敘 : 六芒星之交點、端點共有 12 個點,在這 12 個點裡面放入 12 個相異數字, : 找出這 12 數字之排法,使六芒星線上之數字總合完全相等。 : 說明圖如連結所示 http://ppt.cc/yUL3 : 這裡標記是以最上方為 array[0],順時針方向 : 依序填入 array[1], array[2]..., array[11] : 程式最終「並不是要求得所有合條件之解」, : 而是要求「所有獨立之解,即所有解不可經由 旋轉、順逆時 而得來」。 : 文字說明有點難,以下 (2) 點說明何謂 旋轉、順逆時 而來之解 : 雖表面上要試的解是 12! 組解,但分析之後實際要試的解是 12!/(6*2) 組而已。 : 聲明,六芒星只是一個說明,實際上可能會有 12 芒星、18 芒星,會一直擴下去。 : (2) 解集合說明 : 目前之解為將 array[12] 做排列,判斷總合是否相等,這樣共有 12! 種解法。 : 但這實屬 「環狀排列」 問題,實際上真正的排法根本不到 12! 這麼多, : (2.1) 順逆時針算同一組: : 以 0-1-2-3-4-5-6-7-8-9-10-11 為例,這是順時針,若以逆時針來看 : 0-11-10-9-8-7-6-5-4-3-2-1 這和上面是同一組。 : (2.2) 轉一個端點也算同一組: : 六芒星有六個端點, : 以 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 為例,轉一次變成 : 10-11-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 ,再轉一次變成 : 8 -9 -10-11-0 -1 -2 -3 -4 -5 -6 -7 , : 這樣等於是一個解有 6 種變化 (轉法) : 根據 (2.1) (2.2) ,可知實際上要去試的組數是 12!/(6*2) : ※ 第一個問題 : 請問有沒有辦法只窮舉這 12!/(6*2) 組解,而不是完全窮舉 12! 之解 : (3) 目前去找「不重覆解」之解法 : 先提出一個重要的概念,目前求出之「獨立解」組數並不多,以下為我目前的演算法 : begin : 初始化獨立解 SOL_SET 為空 : (a) 試目前之數列 s : (b) 目前之數列 s 為一組可行解 : (b.1) 自 SOL_SET 裡判斷是否為獨立解 ? 是-> (b.2), 否->(c) : (b.2) 加入 SOL_SET 裡 : (c) s 為最後一組數列 ? 是-> 結束, 否 -> (d) : (d) 取得下組數列, 回到步驟 (a) : end : 由於觀查得知 SOL_SET 之數目並不多,第二個問題便產生 : ※ 請問 SOL_SET 該用何種資料結構? : 我想過的是 : vector< int* >, vector< vector<int> >, : list< int* >, list< vector<int> >, : 最後挑用 vector< int* >,所以才會問是否會有 memory leak 之問題 : 而暴力窮舉法時,目前使用的是 #include <algorithm> 裡面之 next_permutation : 速度上是否會差很多? : 這問題實在很長,謝謝各位版友耐心看完, : 有任何意見請不吝指導,或給 keyword 也行!! : 小弟感激不盡 !! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.114.2

03/11 03:05, , 1F
謝謝 bleed,可能我沒說清楚,那組數列實際上可能是自訂
03/11 03:05, 1F

03/11 03:05, , 2F
唯一條件是 「相異」
03/11 03:05, 2F

03/11 03:17, , 3F
看了您的code,的確該花些時間研究其中技巧,再次感謝!!
03/11 03:17, 3F

03/11 06:58, , 4F
可以把A[i]當作索引,B[i]是任意相異數,那麼...
03/11 06:58, 4F

03/11 06:59, , 5F
C[i] = B[A[i]]; 跑C[i]得解。
03/11 06:59, 5F

03/11 13:05, , 6F
我剛想到,以上方法旋轉和順反時針的函數要重寫。
03/11 13:05, 6F
文章代碼(AID): #1DUFzaRO (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DUFzaRO (C_and_CPP)