免费注册 查看新帖 |

Chinaunix

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

一个google intern的面试题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-12-15 12:18 |只看该作者
原帖由 ArXoR 于 2006-12-15 12:15 发表


。。。还是不行,取完最值还得维护堆性质。。。还要O(logn)...^_^


恩, heap..看过一次, 现在已经忘记差不多了...名字都记不住了....刚才想了至少半个小时才....太丢人了

论坛徽章:
0
12 [报告]
发表于 2006-12-15 15:20 |只看该作者
原帖由 frog_skywalker 于 2006-12-13 18:18 发表
正整数集合s={a1,a2...an}
存在ai*aj=ak, i!=j!=k
求最大的ak


想不到什么好的办法,加法还好办点
现在我是排序,从最大的开始找。
要找的数开根号,以此分成高列,低列。从中间开始乘,往两边移动。

...


加法也不好办吧。由于都是正数,所有数取个log后等价与于对应加法的问题。

论坛徽章:
0
13 [报告]
发表于 2006-12-15 15:47 |只看该作者
原帖由 frog_skywalker 于 2006-12-14 10:18 发表
正整数集合s={a1,a2...an}
存在ai*aj=ak, i!=j!=k
求最大的ak


想不到什么好的办法,加法还好办点
现在我是排序,从最大的开始找。
要找的数开根号,以此分成高列,低列。从中间开始乘,往两边移动。

...

每次相乘的结果,例如n1 * n2 = n, 查找 n 是否与 a(i)  ( 1 <= i <= n ) 匹配,匹配,做做个记号。

从最大开始找,找到做了记号的a(i),算法结束。

论坛徽章:
0
14 [报告]
发表于 2006-12-17 11:32 |只看该作者

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. void inline swap(int *x,int *y)
  5. {
  6.   int tmp;
  7.   tmp=*x;
  8.   *x=*y;
  9.   *y=tmp;
  10. }


  11. void max_heapify(int a[],int i,int j)
  12. {
  13.   int k=i;
  14.   int ind;
  15.   while(2*k+1<=j){
  16.     ind=2*k+1;
  17.     if(ind+1<=j && a[ind+1]>a[ind])
  18.         ind++;
  19.     if(a[k]<a[ind])
  20.       swap(a+k,a+ind);
  21.     k=ind;
  22.   }
  23. }

  24. void build_heap(int a[],int i,int j)
  25. {
  26.   int k;
  27.   for(k=(j-1)/2;k>=0;k--)
  28.     max_heapify(a,k,j);
  29. }

  30. void heap_sort(int a[],int n)
  31. {
  32.   int k;
  33.   build_heap(a,0,n);
  34.   for(k=n;k>=1;k--){
  35.     swap(a,a+k);
  36.     max_heapify(a,0,k-1);
  37.   }
  38. }

  39. int bin_search(int a[],int key,int i,int j)
  40. {
  41.   int low=i;
  42.   int high=j;
  43.   int mid;
  44.   while(low<=high){
  45.     mid=(low+high)/2;
  46.     if(key==a[mid])
  47.       return mid;
  48.     else if(key<a[mid])
  49.       high=mid-1;
  50.     else
  51.       low=mid+1;
  52.   }
  53.   return -1;   
  54. }

  55. int bin_locate(int a[],int key,int i,int j)
  56. {
  57.   int low=i;
  58.   int high=j;
  59.   int mid;
  60.   while(high-low>1){
  61.     mid=(low+high)/2;
  62.     if(key==a[mid])
  63.       return mid;
  64.     else if(key<a[mid])
  65.       high=mid-1;
  66.     else
  67.       low=mid+1;
  68.   }
  69.   return low;
  70. }

  71. int gog(int a[],int n)
  72. {
  73.   int i,j;
  74.   int ind1,ind2;
  75.   heap_sort(a,n);
  76.   for(i=n;i>=0;i--){
  77.     if(sqrt(a[i])<a[0]) continue;
  78.     ind1=bin_locate(a,sqrt(a[i]),0,n);
  79.     for(j=0;j<=ind1;j++){
  80.       if(a[i]%a[j]==0){
  81.         ind2=bin_search(a,a[i]/a[j],ind1+1,i-1);
  82.         if(ind2>=0){
  83.           printf("%d*%d=%d\n",a[j],a[i]/a[j],a[i]);
  84.           return 0;
  85.         }
  86.       }
  87.     }
  88.   }
  89.   return -1;
  90. }

  91. int main(void)
  92. {
  93.   int i;
  94.   int test[10]={13,13,12,11,10,9,8,7,4,1};
  95.   gog(test,9);
  96.   system("pause");
  97.   return 0;
  98. }

复制代码

写了个n(3/2)*logn的程序,不知道对错

论坛徽章:
0
15 [报告]
发表于 2006-12-17 11:59 |只看该作者
原帖由 crspo 于 12/17/06 11:32 发表
[code]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void inline swap(int *x,int *y)
{
  int tmp;
  tmp=*x;
  *x=*y;
  *y=tmp;
}


void max_heapify(int a ...


hash表就好了,不用最内层的二分,省掉O(logn)

论坛徽章:
0
16 [报告]
发表于 2006-12-17 12:09 |只看该作者
原帖由 crspo 于 12/17/06 11:32 发表
[code]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void inline swap(int *x,int *y)
{
  int tmp;
  tmp=*x;
  *x=*y;
  *y=tmp;
}


void max_heapify(int a ...


而且只是复杂度期望是O(n^(3/2)),不是理论最坏界
开方不一定能到达sqrt(n)
比如
2,2^2,2^4,2^8...

论坛徽章:
0
17 [报告]
发表于 2006-12-17 13:46 |只看该作者
原帖由 ArXoR 于 2006-12-17 12:09 发表


而且只是复杂度期望是O(n^(3/2)),不是理论最坏界
开方不一定能到达sqrt(n)
比如
2,2^2,2^4,2^8...

谢谢,我也发现这个问题了,有点大意了。没有比O(n^2)更好的算法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP