[問題] 檢查數字範圍是否相互重疊

看板C_and_CPP作者 (奸商)時間15年前 (2010/08/21 15:56), 編輯推噓6(6015)
留言21則, 10人參與, 最新討論串1/2 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 我把一份文件讀進來 格式大概長這樣子 Note 242655 246400 81 Note 242795 243180 71 Note 243180 246400 74 Note 246400 246785 78 Note 246400 248430 81 我要檢查每個Note的範圍 有沒有相互重疊 像以上有4個Note的範圍有相互重疊到 希望得到的正確結果: 只要偵測到有重疊, 直接移除該行 程式跑出來的錯誤結果: N/A 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) C++/CLI 有問題的code: (請善用置底文標色功能) 補充說明: 我實在想好久想不到一個適當的演算法 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.196.13

08/21 16:02, , 1F
4個全刪除?還是刪除3個留第一出現的那個?
08/21 16:02, 1F

08/21 16:02, , 2F
留下第一個出現的 ..
08/21 16:02, 2F

08/21 16:08, , 3F
範圍的限制? 全為24XXXX?還是會有23XXX,25XXXX??
08/21 16:08, 3F

08/21 16:09, , 4F
範圍會從0開始 最後到多少不一定
08/21 16:09, 4F

08/21 16:10, , 5F
最後可能會到30幾萬
08/21 16:10, 5F
我原本的想法是看範圍有多大開多少的陣列 每讀取一個NOTE就把對應範圍的陣列值改成1 然後之後的NOTE進來, 如果要改的時候發現陣列值已經是1 那該行就要刪除 但是30幾萬實在很難開陣列 ... ※ 編輯: herman602 來自: 114.43.196.13 (08/21 16:15)

08/21 16:19, , 6F
用hash table 不知道是否可行
08/21 16:19, 6F

08/21 16:33, , 7F
先排序(?如果後面有相同的就刪掉,這樣好像效率差
08/21 16:33, 7F

08/21 16:35, , 8F
一維陣列也不能開嗎? 因為只判斷左右界會有盲點。
08/21 16:35, 8F

08/21 16:41, , 9F
我剛有試過開一維的 但是超級慢
08/21 16:41, 9F

08/21 16:45, , 10F
喔!!! 感謝kevintjaco 我改用hash table就超快的!
08/21 16:45, 10F

08/21 16:46, , 11F
問題已經解決 雖然演算法不是非常漂亮xd
08/21 16:46, 11F

08/21 16:47, , 12F
我可以合理懷疑上述問題其實是找重複點而不是範圍?
08/21 16:47, 12F

08/21 16:49, , 13F
其實問題本質是檢查每個Note佔用的範圍有沒有overlap
08/21 16:49, 13F

08/21 16:50, , 14F
但是簡化之後可以看成一個點有沒有被超過一個Note所佔用
08/21 16:50, 14F

08/21 16:59, , 15F
range overlap 我應該會sort後掃描線
08/21 16:59, 15F

08/21 17:16, , 16F
如果留下被包含,包含別人的要刪掉,sort該怎麼處理?
08/21 17:16, 16F

08/21 19:32, , 17F
我怎麼看都覺得明明是第一二行的"範圍"有重疊...
08/21 19:32, 17F

08/22 09:05, , 18F
三十幾萬開陣列...我比較好奇會不會程式先爆掉
08/22 09:05, 18F

08/22 09:49, , 19F
樓上你去算算三十萬個int才幾mb...
08/22 09:49, 19F

08/22 10:06, , 20F
樓樓上指的應該是靜態區域陣列
08/22 10:06, 20F

08/22 13:37, , 21F
bitset<3000000> a; (笑
08/22 13:37, 21F
文章代碼(AID): #1CRuQt6D (C_and_CPP)
文章代碼(AID): #1CRuQt6D (C_and_CPP)