请教一个算法问题

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]
3363 次点击
所在节点    问与答
35 条回复
em70
2014-08-17 13:32:07 +08:00
A,B数组长度相等吗
luoluoluo
2014-08-17 14:03:13 +08:00
@em70 等长,这个影响解法吗?
wisatbff
2014-08-17 14:07:19 +08:00
先排序,然后就不用说了吧
freetg
2014-08-17 14:08:03 +08:00
k=0
for i in xrange(n-1):
for j in xrange(i+1, n-1):
if A[i] < B[j]:
k += 1
print k
luoluoluo
2014-08-17 14:10:34 +08:00
@wisatbff 在下愚钝,请详述
@freetg 这个解法太过暴力
yangff
2014-08-17 14:11:09 +08:00
树状数组
wisatbff
2014-08-17 14:18:12 +08:00
@luoluoluo 排序之后和归并排序的“归并”操作类似
em70
2014-08-17 14:57:48 +08:00
遍历肯定可以解决,算法复杂度2^n,主要你希望简化到多少?
takato
2014-08-17 15:04:14 +08:00
O(nlogn)
luoluoluo
2014-08-17 15:06:37 +08:00
@yangff 数组数组是指数组区间维护最小值,查询的时候变快了,O(nlog(n))吗?

@wisatbff 是说按照数组值排序,再顺序往下归并,在依次比较下标吗?(如果我理解错了请说的在详细点,谢了哈)可是对于每个A的下标,B中可能存在不止一个下标符合,这样最坏的情形是不是O(n^2)

@em70 我希望可以降到O(n)
bcxx
2014-08-17 15:15:38 +08:00
@luoluoluo 试试可以将两个数组进行基排(或者其他 O(n) 的排序算法),然后再遍历两个数组,用类似归并排序的方法来逐个比较就可以了。这样就 O(n) 吧
xjx0524
2014-08-17 15:15:42 +08:00
两个数组分别排序O(nlog(n))
遍历A数组,对其中每个元素在B中二分,可以知道有多少比他大的
这样时间复杂度O(nlog(n))
bcxx
2014-08-17 15:21:15 +08:00
@bcxx 诶这里还说错了,应该是 O(n+k) 之类的排序算法……
xjx0524
2014-08-17 15:25:05 +08:00
@bcxx 仔细想了下,排序完之后可以O(n)统计结果,那样瓶颈就在排序了
GtDzx
2014-08-17 15:25:40 +08:00
线段树或者树状数组 复杂度O(nlogn)
元素取值范围足够大的话,应该不存在O(n)算法。否则可以通过构造这类问题来O(n)解决n个元素排序问题。(这点我没想太仔细,不过感觉是上可以这样证明复杂度下限的 :P)
luoluoluo
2014-08-17 15:28:15 +08:00
@xjx0524 下标考虑了吗?

@bcxx 归并的话如我上面所说,如果B里面的数都大于A,最坏的情况是O(n^2)吧
xjx0524
2014-08-17 15:31:56 +08:00
@luoluoluo 和下标有什么关系?

归并那种方法,如果B里面的数都大于A,最坏的情况是O(2n),省略常数就是O(n)
luoluoluo
2014-08-17 15:36:13 +08:00
@xjx0524
i<j && A[i]<B[i] 共有多少组组合满足,怎么和下标没关系呢? i < j
xjx0524
2014-08-17 15:43:03 +08:00
@luoluoluo
我说的那种二分的方法,假设n为B数组元素个数
遍历A数组,拿a[i]在B中二分,找到位置使b[j]<=a[i]且b[j+1]>a[i],那么总结果就加上n-j-1(如果数组索引从0开始)
对A数组中每个元素都这么做时间复杂度O(nlogn)
glasslion
2014-08-17 15:45:43 +08:00
keyword: 逆序数

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

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

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

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

© 2021 V2EX