请教一个算法问题

2014-08-17 13:25:07 +08:00
 luoluoluo
对于数组A,B:
A = [a0, a1, ... , an-1]
B = [b1, b2, ..., bn-1]
有多少组i, j使得:
i < j && A[i] < B[j]
3295 次点击
所在节点    问与答
35 条回复
bcxx
2014-08-17 15:51:18 +08:00
@luoluoluo 不是 O(n^2) ...
shoumu
2014-08-17 16:15:10 +08:00
@glasslion 能详细说明一下吗,我没有想明白
shoumu
2014-08-17 16:17:41 +08:00
@xjx0524 直接排序的话有点问题吧
如:A = [1, 2, 3] B = [3, 2, 1] 满足条件数为1
A = [3, 2, 1] B = [1, 2, 3] 满足条件数为0
bcxx
2014-08-17 16:34:46 +08:00
@shoumu 要预先记录一下原下标
joying
2014-08-17 16:58:19 +08:00
时间复杂度O(nlogn),先对两数组排序,后遍历A数组,对B数组进行二分查找,找到刚好比A[i]小的数的下标j,通过下标即可知道比A[i]大的B[j]的数量。

可以再优化,对B数组的二分查找不必从0开始,而是从刚好比A[i]小的B[j]开始。
aheadlead
2014-08-17 17:38:20 +08:00
记得有个很奇妙的方法可以做到 线性时间复杂度
xjx0524
2014-08-17 17:50:06 +08:00
@joying 哥们咱俩思路一样,但其实是错的,题目要求的不是任意i,j使得a[i]<b[j],是要求i < j时 A[i] < B[j],一排序就乱了。。。
Exin
2014-08-17 17:52:10 +08:00
不太明白你们为什么说排序……

我想角标和本身的值可以看做两个等价的属性,
那么排序前角标是有序的,排序后值是有序的,
那么排序应该是没有意义的。

能解释下吗?
yangff
2014-08-17 17:58:12 +08:00
不可能做到线性
如果让A=B
那么问题就变成求A的逆序对数
A的逆序对数的已知最优复杂度是O(nlgn)
故原问题复杂度不可能小过O(nlgn)
joying
2014-08-17 18:07:40 +08:00
@xjx0524 额。。。忽略了前面的i<j
luoluoluo
2014-08-17 19:34:12 +08:00
@bcxx Are you sure? Show me please.
@glasslion 那个对于一个数组理解,对于两个数组怎么操作?
@aheadlead 确定么?要是能找出来就好了哒
@yangff 树状数组能数细点么?
@xjx0524 ^_^
@joying ^_^
aheadlead
2014-08-17 19:35:37 +08:00
- - 好像看错了 是不是求逆序对啊...
yangff
2014-08-17 20:48:54 +08:00
@luoluoluo 窝系统挂了。。
你百度一下树状数组求逆序对,然后把查询比Ai小的变成查询比Bi小的就可以了
wisatbff
2014-08-17 21:11:18 +08:00
@xjx0524 带着下标一起排,没问题啊
tideline
2014-08-17 22:54:44 +08:00
这应该是一个稍作变形的逆序对问题吧,用树状数组写了一下,时间复杂度O(nlogn),代码: http://paste.ubuntu.com/8071502/
这个版本的缺陷在于对数的大小有限制(数组里不能有负数和太大的数),可以离散化改进一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/128358

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX