免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5248 | 回复: 12
打印 上一主题 下一主题

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

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-18 00:18 |只看该作者 |倒序浏览
有2个数组A,B 从每个数组中选择一个数相加,然后求前k个最大的数。例如 A: 3,2,1 B 4,2,3 求前2大的数是多少。结果是7和6
http://ask.chinaunix.net/question/389

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2014-05-18 01:28 |只看该作者
想了个算法
1、在A中取top K,复杂度O(Na * log(K))
2、在B中取top K,复杂度O(Nb * log(K))
3、对于每个top K中的An,加上top K中的Bn,对结果再取top K,复杂度O(K*K)
总共的时间复杂度是O(K * log(Na) + K * log(Nb) + K*K),如果Na和Nb近似为N,整个算法的时间复杂度约为O(N*log(K) + K*K*),如果K相对于N很小,则第二项可以忽略
第三步还有优化的空间,不过懒得想了。

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
3 [报告]
发表于 2014-05-18 08:54 |只看该作者
第一个那么暴力也算最佳??

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
4 [报告]
发表于 2014-05-18 09:18 |只看该作者
本帖最后由 Susake_ 于 2014-05-18 09:19 编辑

暂时也只能想到O(k^2)的~~
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int comp(const void *a, const void *b)
  5. {
  6.         return *(int *)b - *(int *)a;
  7. }

  8. int main(int argc, char *argv[])
  9. {
  10.     int a[4] = {3, 2, 1}, b[4] = {4, 2, 3};
  11.     int max[4], i, j, k;

  12.     qsort(a, 3, sizeof(int), comp);
  13.     qsort(b, 3, sizeof(int), comp);

  14.     while(scanf("%d", &k) != EOF)
  15.     {
  16.         memset(max, 0, sizeof(max));

  17.         for(i = 0; i < k; i++)
  18.             for(j = 0; j < k; j++)
  19.                 if(a[i] + b[j] > max[i]) max[i] = a[i] + b[j];

  20.         for(i = 0; i < k; i++)
  21.             printf("%d\n", max[i]);
  22.     }
  23.     return 0;
  24. }
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2014-05-18 11:58 |只看该作者
回复 4# Susake_


    没看代码, 你这个算法复杂度里没有n,是错误的,
这种算法, 数学上能达到的理论最佳复杂度是 log n *K,
正好是建堆的算法的复杂度, 所以: 用堆算法。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2014-05-18 12:06 |只看该作者
这是挖坟?“CU问答”已经解决了,就是在最大堆上弹出k个元素。

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
7 [报告]
发表于 2014-05-18 13:14 |只看该作者
回复 5# folklore
题目本身就没有说明输入格式~~所以以提供的数据开刀了!!


   

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
8 [报告]
发表于 2014-05-18 13:36 |只看该作者
回复 6# timespace
百度了一下

最大堆/最小堆


 堆的定义是:n个元素的序列{k1,k2,…,kn},当且仅当满足如下关系时被成为堆

    (1)Ki <= k2i 且 ki <= k2i-1        

  或 (2) Ki >= k2i 且 ki >= k2i-1  

          (i = 1,2,…[n/2])

当满足(1)时,为最小堆,当满足(2)时,为最大堆。

----优先队列~~

for(i = 0; i < sizeof(a)/sizeof(int); i++)
       {
           for(j = 0;j < sizeof(b)/sizeof(int); j++)
           {
               pq.push(a+b[j]);
           }   
       }   
嗯嗯~~考虑极端情况,将n項输出~~也就是priority_queue了!!
   

论坛徽章:
0
9 [报告]
发表于 2014-05-18 22:44 |只看该作者
这是一个杨氏矩阵的问题,先两个数组排序,O(logn),构建矩阵时间复杂度O(N*N),根据杨氏矩阵特性,求前K个数O(N),总的时间复杂度O(N*N)

论坛徽章:
11
巨蟹座
日期:2013-12-23 11:12:14双子座
日期:2014-08-28 09:14:55子鼠
日期:2014-07-25 16:21:22摩羯座
日期:2014-07-23 15:17:47摩羯座
日期:2014-05-30 13:09:05午马
日期:2014-04-30 18:10:00天秤座
日期:2014-04-25 12:12:00申猴
日期:2014-04-22 11:30:15午马
日期:2014-03-07 16:06:40辰龙
日期:2013-12-25 18:36:00摩羯座
日期:2014-09-02 17:00:55
10 [报告]
发表于 2014-05-18 23:14 |只看该作者
回复 9# xiaohuan4518
是丫!!这就是我想表达的,那个第一个构建优先队列就是O(n^2)了,还不包括构建的过程~~


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP