免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: action08
打印 上一主题 下一主题

[算法] 百度面试碰到一个问题 [复制链接]

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
11 [报告]
发表于 2014-05-19 15:00 |只看该作者
windoze 发表于 2014-05-18 01:28
想了个算法
1、在A中取top K,复杂度O(Na * log(K))
2、在B中取top K,复杂度O(Nb * log(K))

假设分别对 A,B降序排列后形成 A'[1..n], B'[1..n],
那么很显然,
最大的数是A'[1]+B'[1],
第二大是Max( (A'[1]+B'[2]),  ( A'[2]+B'[1])),
第三大,如果 A'[1]+B'[2] > A'[2]+B'[1], 则 Max( (A'[1]+B'[3]), (A'[2]+B'[1])),
           否则                                            Max( (A'[1]+B'[2]), (A'[3]+B'[1])),
依次类推,

事实上,我们并不需要对A,B排序,甚至最多只需要取出某一方的Top(K),算法复杂度就是Top(K)的复杂度。

论坛徽章:
0
12 [报告]
发表于 2014-05-19 16:33 |只看该作者
本帖最后由 w359405949 于 2014-05-20 13:34 编辑

A 3,2,1 B 4,2,3

0,最大和最小是特例,可以在排序后直接获得,这里只给出求[2, k-1]的O(nlogn)算法

1,分别排序
A 3,2,1 B 4,3,2

2,分别求数组中每个元素相对于该组最大数的差值
A 0,1,2 B 0,1,2

3,以2中求取出来的差值将两个数组的数排序得数组C,并标记为数组A还是数组B,两个组最大的数不纳入排序
C 2(A, 1) 3(B, 1) 1(A, 2) 2(B, 2)

4,取K个最大,那么就从C中依次取值,并与相对的数组最大值相加,那就是第K个最大数的值。
例:
k = 2
2(A, 1) + 4(B) = 6
k = 3
3(B, 1) + 3(A) = 6
k = 4
1(A, 2) + 4(B) = 5
k = 5
2(B, 2) + 3(A) = 5

得:[2, k - 1]的顺序为 6, 6, 5, 5 (相同解可合并可不合并)

算法复杂度为:
快排(步骤1)O(nlog n) + 分别求值(步骤2)O(n) + 合并排序(步骤3)O(n) + 取值 (步骤4)O(k) = n log n (算法总时间取决于排序的时间复杂度)

===
上次把快排的时间复杂度记错了,这里做修正。


论坛徽章:
1
15-16赛季CBA联赛之同曦
日期:2016-04-23 22:00:26
13 [报告]
发表于 2014-05-20 22:47 |只看该作者
时间复杂度
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP