看板 C_and_CPP 關於我們 聯絡資訊
( *[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
bleed1979:4個全刪除?還是刪除3個留第一出現的那個? 08/21 16:02
herman602:留下第一個出現的 .. 08/21 16:02
bleed1979:範圍的限制? 全為24XXXX?還是會有23XXX,25XXXX?? 08/21 16:08
herman602:範圍會從0開始 最後到多少不一定 08/21 16:09
herman602:最後可能會到30幾萬 08/21 16:10
我原本的想法是看範圍有多大開多少的陣列 每讀取一個NOTE就把對應範圍的陣列值改成1 然後之後的NOTE進來, 如果要改的時候發現陣列值已經是1 那該行就要刪除 但是30幾萬實在很難開陣列 ... ※ 編輯: herman602 來自: 114.43.196.13 (08/21 16:15)
kevintjaco:用hash table 不知道是否可行 08/21 16:19
diabloevagto:先排序(?如果後面有相同的就刪掉,這樣好像效率差 08/21 16:33
bleed1979:一維陣列也不能開嗎? 因為只判斷左右界會有盲點。 08/21 16:35
herman602:我剛有試過開一維的 但是超級慢 08/21 16:41
herman602:喔!!! 感謝kevintjaco 我改用hash table就超快的! 08/21 16:45
herman602:問題已經解決 雖然演算法不是非常漂亮xd 08/21 16:46
bleed1979:我可以合理懷疑上述問題其實是找重複點而不是範圍? 08/21 16:47
herman602:其實問題本質是檢查每個Note佔用的範圍有沒有overlap 08/21 16:49
herman602:但是簡化之後可以看成一個點有沒有被超過一個Note所佔用 08/21 16:50
Yshuan:range overlap 我應該會sort後掃描線 08/21 16:59
bleed1979:如果留下被包含,包含別人的要刪掉,sort該怎麼處理? 08/21 17:16
jlovet:我怎麼看都覺得明明是第一二行的"範圍"有重疊... 08/21 19:32
a1e:三十幾萬開陣列...我比較好奇會不會程式先爆掉 08/22 09:05
zerodevil:樓上你去算算三十萬個int才幾mb... 08/22 09:49
loveme00835:樓樓上指的應該是靜態區域陣列 08/22 10:06
chrisdar:bitset<3000000> a; (笑 08/22 13:37