[問題] 陣列中的比自己小的數字

作者: jason21716 (阿鴻)   2016-10-31 14:00:08
各位好,小弟有一個演算法的問題想請教各位大大
有一個陣列,內有若N個不相同且隨機排列的數字
如:2 8 6 1 9 10 13 0
我需要依照陣列順序把排在自己之後而且比自己小的數字印出來
像這樣:
2 1
2 0
8 6
8 1
8 0
6 1
6 0
9 0
10 0
13 0
我知道如果用迴圈一個一個檢查總是有結果的
但是演算法效率是O(n^2)
想請問各位有沒有比O(n^2)更快的做法??
我想了很久,但都沒有比較好的解法...
不好意思麻煩各位了
作者: Astar5566 (一顆星5566)   2016-11-07 16:28:00
沒錯 只是要印出來
作者: ddavid (謊言接線生)   2016-10-31 14:35:00
極端來講,我給你8 7 6 5 4 3 2 1,你光是印出答案就需要O(n^2),頂多係數可以給你最小化到1/2罷了直接做O(n log n) sort並保留原始順序的link,期待印出步驟的次數期望值落在O(n log n)也許比較實在
作者: CaptainH (Cannon)   2016-10-31 15:01:00
考慮merge sort,在merge時加個一兩行就行了
作者: pttworld (批踢踢世界)   2016-10-31 16:29:00
類別二欄位index和value,排序後判斷索引輸出得解。
作者: s89162504 (阿本)   2016-10-31 19:52:00
mergesort怎會變成O(n^2)
作者: pttworld (批踢踢世界)   2016-10-31 20:05:00
回原po,n個都要列出關係起算就n往上了。一樓說得很白。
作者: c225 (嘟嘟嚕~~~)   2016-11-01 00:20:00
解的大小本來就Ω(n^2)了 所以merge sort複雜度應該是O(nlogn + k) k是解大小~
作者: DJWS (...)   2016-11-01 10:38:00
比較快的方法應該是hashing/counting sort/位元操作之類的如果只能兩兩比較的話,那麼就是推文一樓說的那樣子,接下來的方向會是隨機算法/平滑分析之類的另外這題有個有趣的性質:當數值(連帶索引值)重新排序之後問題變成找到後方的更大索引值,類似於原本問題,但是索引值的範圍會是連續正整數,成為更簡單一點的問題至於這性質有什麼用...我也不知道 XD
作者: rifiz (薩哈拉雅)   2016-11-07 02:24:00
count inversion problem?
作者: HoloLens (GoogleGlass沒了ww)   2016-11-28 23:23:00
看起來超像逆序數對,merge nlogn不會漏判啊為何要掃左右兩邊?

Links booklink

Contact Us: admin [ a t ] ucptt.com