[问题] 阵列中的比自己小的数字

楼主: 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