计算机专业面试题集(一)

来源:互联网 发布:淘宝二维码扫码付款 编辑:程序博客网 时间:2024/06/09 09:12
1、线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表h;SimWer个人空间#f|,^*Gm9r Cr*N
2、运用四色定理,为N个局域举行配色,颜色为1、2、3、4四种,另有数组adj[][N],如adj[i][j]=1则表示i区域与j区域相邻,数组color[N],如color[i]=1,表示i区域的颜色为1号颜色。
%?8ty'~V7R,kKP03、用递归算法判断数组a[N]是否为一个递增数组。
4R/{{K5K7^04、编写算法,从10亿个浮点数当中,选出其中最大的10000个。
/ wBPe:~05、编写一unix程序,防止僵尸进程的出现.
#[,/_9Z6}N(~jC0SimWer个人空间/&CCbiR2M:[
同学的4道面试题,应聘的职位是搜索引擎工程师,后两道超级难,(希望大家多给一些算发)SimWer个人空间1y:x;t4^Ov
1.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数SimWer个人空间/tXRQ�y0hW m
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])SimWer个人空间GC4`#^l ~
2.单连表的建立,把'a'--'z'26个字母插入到连表中,并且倒叙,还要打印!SimWer个人空间 OM:|5IX`
3.可怕的题目终于来了
Y+[Y"L'HUV?[8G0象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,SimWer个人空间v:k;N&t D dyI
请描述思想,写出算发(c语言),空间和时间复杂度,
8^/ N'x:W;J2o.o6O04.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度,SimWer个人空间H qL.B1Y Na
SimWer个人空间*T,n Ns@-of

U V*_nG/SaI[0SimWer个人空间lQ-|drG
SimWer个人空间 e1V5rQNEe
SimWer个人空间;O,nd1qI
时间问题,我不发代码了,但这些问题书上都有,我给你说一下书名SimWer个人空间$`z@x:O3_
SimWer个人空间V7}%N*i$Z/ES;Q%S%W
1、线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表h;SimWer个人空间 A3v5`&Clm.t
答案在 请化大学 严锐敏《数据结构第二版》第二章例题(有错字不好意思 下同)SimWer个人空间:P,X,UG:[m1t$?,n
SimWer个人空间9n4px%g0J
2、运用四色定理,为N个局域举行配色,颜色为1、2、3、4四种,另有数组adj[][N],如adj[i][j]=1则表示i区域与j区域相邻,数组color[N],如color[i]=1,表示i区域的颜色为1号颜色。SimWer个人空间 yu"h|8?Q/z8w
答案在 中国水利出版社 引进的一套国外《数据结构》教材上,单兰色的封皮(这套书包括操作系统(利用的minux),多媒体都有,估计有年岁了)SimWer个人空间it QF1hv$Q7j

E|V W |"_9B03、用递归算法判断数组a[N]是否为一个递增数组。
^)f.C iXq1G:}0这个我没在教才上看到过 但不难!!
-f/.|g k6^0?:j0一会贴代码SimWer个人空间1J5R}~w2Y

_+nFb)]|Z_^04、编写算法,从10亿个浮点数当中,选出其中最大的10000个。SimWer个人空间&C-I([Q9yi4i!T#n v
用外部排序,在《数据结构》书上有!!!
m I(N5JH _6Jr.TA0SimWer个人空间sqwO4l|,s
5、编写一unix程序,防止僵尸进程的出现.
&L.pa'}E|7U0你说的 僵尸进程 是死锁吗?unix程序我不会
9B6b0P MO Nce0
f#TrK*S[01.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数
`/{.J1r X G"d+DEz[ J�G0long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
'RB&B Pf7xO A0SimWer个人空间:m,^,W"FHo(_g!q1|+Q
这个我没在教才上看到过 但不难!!
,X;s;VE-J1j _%~0一会贴代码SimWer个人空间 E0Q.UZQ+s[8?0aH

/?2@uB8kmh:Q|m&w02.单连表的建立,把'a'--'z'26个字母插入到连表中,并且倒叙,还要打印!
&}N pA2U E#z$L0这个有点读不懂
7?%n0J!^ O�/*lp0`K1n0SimWer个人空间Woa-A ^)V,SJ#|
3.可怕的题目终于来了SimWer个人空间|%T&OpW)`#?5w5j
象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,SimWer个人空间h*l�g.U,g"n&U+V
请描述思想,写出算发(c语言),空间和时间复杂度,SimWer个人空间(]9Y!n&X7x'/
的确可怕,
m4hw&Evk!W(B@0h)x yB6U0
eY0A4ok3zM9eF(U)j04.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度.SimWer个人空间_G d6ZiC k
的确可怕,
o_%S l�m'DUj5W-] n0SimWer个人空间;/&uV:c4K:E#C#vO
SimWer个人空间z/oj3V7vBB?7T
SimWer个人空间 yDR~#N*IJ[-c*g
SimWer个人空间"}PENv
1、线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序
(t3P[6bORgm/,@0
+w9ZYIy;R6[6x0二路归并,不难SimWer个人空间 Qt'R.Xu C,Z
2、运用四色定理,为N个局域举行配色,颜色为1、2、3、4四种,另有数组adj[][N],如adj[i][j]=1则表示i区域与j区域相邻,数组color[N],如color[i]=1,表示i区域的颜色为1号颜色。
/Ef{A,v0可转化位图论问题,将各个区域视为图上的点,相邻的点之间连上一条线,构成一个无向图,可得其邻接矩阵,根据邻接矩阵得色数.
zS6T-|'i+F03、用递归算法判断数组a[N]是否为一个递增数组。SimWer个人空间-wEGh4Y:rx)cm
楼上有正解SimWer个人空间h9W"dO"y:J

5p$lw|v X_0
!Hcw3J!MHL04、编写算法,从10亿个浮点数当中,选出其中最大的10000个。
.E:erd4W%v"Q0用快排.可先从10亿个浮点数当中选出第10000大的数,设位M,在选M位基值,利用一趟快速排序,M
!Z.cWZ0YXi0之后的数即为所求.
@/|*Vj0
c8G*KG7t/L.{0
Q;hK!n]&S0
2P W3cX7~^r G01.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数
~x[)p h0long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
:T4/2i'Q V8r0我想到的是蛮力法,时间复杂度位O(alength*blength);想必大家都知道了!SimWer个人空间`r rD/P`Pz$o ]
SimWer个人空间Qr(ck!x.v,?$e
SimWer个人空间 P4[ c9AkmdE-F!D'X,a
2.单连表的建立,把'a'--'z'26个字母插入到连表中,并且倒叙,还要打印!SimWer个人空间4R3z2jKS7^7^UB4F
在创建单链表的时候使之逆序,不难.SimWer个人空间.ei2w)c;j)]g#EUi_^3f
SimWer个人空间-S K} o FmGwgC z
3.可怕的题目终于来了
PE�W%K&m3N0象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,
-@!u ] ? XfV0请描述思想,写出算发(c语言),空间和时间复杂度,SimWer个人空间-?}$B0fqzM
255byte*300万<1G;也就是说可全部调进输入信息,利用PAGERANK算法实行频率统计,排序即可.
~i p,wwF0注:PAGERANK算法受google专利保护,看不到源代码.SimWer个人空间7]1a pi,S Tn8U

!j/x2m*OW1wH|01、线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表h;
0?v r"~ X$BZ%Mm[0   已知:a[0]<a[1]  ...a[n-1]<a[n];SimWer个人空间 d%V5/2Vdm
            b[0]<b[1]  ...b[n-1]<b[n];
_n+JmF([U*d0   SimWer个人空间4NN1y6Kd
    一、a[n]<b[0]SimWer个人空间nk,{/]6aD(S*H
    二、b[n]<a[0]
h3C"b'BI?H t,l2x0    三、插入排序&&二分排序
;n$o!F�?6lp:hE!kW J0   #include "stdio.h"
a I:QL5w0#include "conio.h"SimWer个人空间-AfN;b!a+g3]
SimWer个人空间iFzg2l:Yq

5H_"uF#T2G0main()SimWer个人空间nE&`j,e
{
2N;C�R0C]0    int i,j,k;
[9g%zx7C-r A0    int h[20];
;q.[vsKlmj0    int a[10]={2,5,6,9,11,24,56,78,80,81};
}F$uO3k y0    int b[10]={1,3,8,7,10,21,32,45,65,79};SimWer个人空间4US^8c2//*j n
    i=0;
q6J)E]l2d L_u0    j=0;SimWer个人空间:R5Wb5p;Vo@
    for(k=0;k<20;k++)SimWer个人空间:t3T^?Qb0C
       if(a[i]>b[j])
awsj;Y3U;m$L0             { h[k]=b[j];j++;}SimWer个人空间]2g&@.W./1g[8t P}%@,M2k
          elseSimWer个人空间~$E$L|"G5/
             { h[k]=a[i];i++;}SimWer个人空间8CARU2O1m
SimWer个人空间Y;^ E,G C1c

zh {9a @i Q@0    for(i=0;i<20;i++)
!}6f-CJ_M$N(N/L3yb0        printf("%d ",h[i]);
Da2?fNMr-^]0SimWer个人空间b1N9a7S v|UZ
SimWer个人空间5Kn+q C*|1o7S*V
    getch();
I$YfC C,x`1R M0
-sf6K n:Xfp0}SimWer个人空间"pJ0Z"Rz2z0v

d/I4t3D/dBV0//单连表的建立,把'a'--'z'26个字母插入到连表中,并且倒叙,还要打印!SimWer个人空间8i]P0`-OqCT
SimWer个人空间l#gZ RO//U
node *p = NULL;
~3?4zB1Lj5ZmX0node *q = NULL;SimWer个人空间9?0u!PN0UeX

%I7] z,c'Sx,Nd0node *head = (node*)malloc(sizeof(node));SimWer个人空间2`8G^G~Z2_5g ?
head->data = ' ';head->next=NULL;SimWer个人空间9SW�v5Vn? QW/Z

N am.dMP&}0node *first = (node*)malloc(sizeof(node));SimWer个人空间%Zl,/8S7E
first->data = 'a';first->next=NULL;head->next = first;
k#l4d1XR.t0p = first;
)X?K"q�[ ^0
m�~ D?*rX0int longth = 'z' - 'b';
xiD1i;o#o1A0int i=0;
E o'? i]duUE0while ( i<=longth )
geS'~t7r3cg0{SimWer个人空间I%X+C-w} ^V}4m"z
node *temp = (node*)malloc(sizeof(node));SimWer个人空间Mb"}%GD&T7vg['yt;b
temp->data = 'b'+i;temp->next=NULL;q=temp;
.z8z.Uc}/%[0
yxK@-eQ+N8Q0head->next = temp; temp->next=p;p=q;SimWer个人空间;eN�U#lX-[
i++;
1|`1`'A7A1p${D0}SimWer个人空间F!}]+p%a&B4C"H

X't{N7?4p0print(head);
Yc@)gr+m0SimWer个人空间Z.t*qd'a2B;b D,|s
SimWer个人空间!JC1E6C/
SimWer个人空间7oSbh&vj

2k*T+C] LR0其实第四题这样的题目楼上没有人说对。
e�` w6J5y7}`{&{2T4L0说是从10亿个数中选,实际上是说数很多。当然用外部排序是一个方法。SimWer个人空间I9W1C#d{:L!Z
估计想考的是看你会不会二叉排序树。SimWer个人空间IAS@#L'C
10000个最大的数,就是10000个结点,这个内存是可以装下的。SimWer个人空间/o@d3a0xcSj
但10亿个数就要从外部文件读出来了。每读入一个/组,就试图将之放入排序树中。等10亿个数全读完了,10000个结点按中序输出就行了。
Ky*_m8zuum$g$D{6z0我还在CSDN中见过类似的题目,答案也是二叉排序树,好像没人回答出来。SimWer个人空间3kz4Nw/?~:Z0~;I

}O {0Bmm|0SimWer个人空间0IG:D6Nhc;q

S&Y)t)fG Tk7J0SimWer个人空间2rc5Eo+Yy`
象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,
sW2b1g(tw{ qC0请描述思想,写出算发(c语言),空间和时间复杂度,
C�y ?^1G{P3H$[w0这道题不是很难吧,用哈希的方法,将这些字符串哈希到不同的桶中,然后判断那个最多就行了
!r$de`F8Q0SimWer个人空间o2aC4rjl

D+[ x(r"{�^[]m0SimWer个人空间4M1~^U;x

1~0S4DvPL+vg0
3E.k9oJ4TZ2n0关于第4题的我写的程序
W@({A#JD0SimWer个人空间's7R1h0l$lkE
#include <stdio.h>
X;J9Y"h#} /0#include <iostream>SimWer个人空间yv|N6z t.q`j
#define MAX 1000000  //设置总数,我这里设置了一百万,也可以到一千万,一亿的话内存受不了,但是我的程序是串行读出数据的,所以也是可以处理更大的数据的,这里全部放在数据里是为了方便SimWer个人空间+?FT/Z5O3i+{S
#define TOP 1000SimWer个人空间Ts"_e8~#`

!L{Nt(r'T0void quicksort(int array[ ],int left,int right)SimWer个人空间8kFT*K2p/GmL
{SimWer个人空间O+f7~0MyxANR![U
if(left < right)SimWer个人空间@4Z0E+N_;uZ1?S
{SimWer个人空间E [�h(DM
        int div = array[right];
k{C!t2]*rbu0int i = left;SimWer个人空间 R)k@ i(z�K?)r
int j = right-1;
O+a+f|'}|0int temp;SimWer个人空间1q BH$T"x6q@kA
if(i==j){//只有两个数据,直接处理完了事SimWer个人空间F(c-U}7]a
if(array[i] < div)SimWer个人空间,KTj/L$U1h.w V6NG'e
{SimWer个人空间;u"? w([d{/0A
                array[i+1] = array[i] ;SimWer个人空间YOr'~K_.j!h9oF
                array[i] = div;
G,s,k"clgZB3ns0return;
S+l~8H DG_{1a0}SimWer个人空间-U| t] }^o%G0qC
}
FoI8IDyU0else
l�uf,q4q4y0{
4oO5pk]5E/0while(i< j)
d5z1lq_)@1{0{
} u%cI3d9y0for( ; array[i] > div ; i++);
G5QW!S[/h0for( ; array[j] <= div ; j--);SimWer个人空间BEf'FuD8} {
if(i>=j)break;SimWer个人空间]4L7z6G#Gap�dA

"]i~8`p.[8/a'M0temp = array[i];
v2O&Qi-Fi2wM0array[i] = array[j];
TR?@5y"i Z @ U@0array[j] = temp;
]x/|I'_+U-[Yl0SimWer个人空间^$rA ?ECz&E rE
}
d9p-p/"N2Mv0SimWer个人空间)Id&c/G3jD8i-c
if(i!=right)SimWer个人空间2B0d�D�H I,P E%B
{      SimWer个人空间)]cH Il7Sd1}
array[right] = array[i];SimWer个人空间Ar*zLQ
array[i] = div;
d�Us&O4|"D&Y*_sd0}SimWer个人空间2J7ch g1H(J%B#k
            quicksort(array,left,i-1);SimWer个人空间Rz"P8{ `.O*b8r:^C_
quicksort(array,i+1,right);
(d'n4vc ?$e.R[0SimWer个人空间@ p ^,j"X
}SimWer个人空间 l+n&E s3NPni[
}SimWer个人空间@�`y-X_(v'kC`)R
}
#BAN4F_1G9A@0SimWer个人空间l{-a2F~7{

0T,o!J%fF'c VP vYF0
o%N/L[H0int main()
0]I8T./i0{
RJ:P){R)Q2wd0SimWer个人空间)_"E.zW pYX[
  int *Big = new int[MAX];
Q&o1F{Q0  int * pSort = new int[TOP*4];//最好pSort[0]-pSort[Top-1]为结果SimWer个人空间8Um _h&N(v6^
  int i=0, j=TOP, k=0;
j)ig+W�DQA#^f.~iz0  int h=0;
|4g0B8P)ms0  int all = 0;//Big数据计数器
D$n&L0] rt:Kx]&z4z0  srand(time(NULL));SimWer个人空间`5u9O.A._8]H7i
  for( i =0; i< MAX; i++)SimWer个人空间"n&_o#wT:~O.N
  {
gv8C,v4s�lRSb0//int jj= rand( )%77 + 1;SimWer个人空间8D8Ya-Mo(x!B5Qn
//int nn = rand( )%jj;
j4Q3d}.Io q0        Big[i] = rand( );SimWer个人空间4h;SK4j8mhk |z
//cout<<Big[i]<<" ";SimWer个人空间Oq0S+o!wZ
  }SimWer个人空间 MoI `,TN.r7b

aS/Bo,B}-o0  //可加入一些测试数据,看看大的能否排到前面
#x�}4`.ge0b [0  Big[0] = 100000;SimWer个人空间~&aVl8j4LV0g
  Big[10] =300002;
|�f7i2L*N+Fo#F0  Big[11] =200002;SimWer个人空间b/@8E G /^u
  Big[MAX-2] =200007;SimWer个人空间.Q~5ja$|&l5o
SimWer个人空间 /jn+^C9o
  int temp = Big[0];SimWer个人空间0h7YD�v,G$zJdzO
SimWer个人空间7a'k6[M4R{#@ z%[_
  for( all = 0; all < TOP; all++)
&}Lv3xU4l6|A5]({0  {
S?jJe&j$l0  pSort[all] = Big[all];SimWer个人空间&{L*K-Z$IO:e
 SimWer个人空间b:P*{4F tk6fEu;f
  } 
3}%~w#hr`(N!w0  quicksort(pSort,0,TOP-1); 
)T[&@o�I0 SimWer个人空间!~z/g&D!?*e w2z
  //for( k =0;k<TOP-1;k++) cout<<pSort[k]<<"";SimWer个人空间*a8i i.NIF]
  //cout<<endl;SimWer个人空间/s8P:eN2/F
  temp = pSort[TOP-1];
aZ-^)]Mq1W0  i = TOP-1;
BA5bf.v0  j = TOP*2;
4`U%NRdH5V_Z0
]%B yts~{9M%_K0  int sum = 0;
z`*Wj%i&H0 SimWer个人空间 ZTbQgi1S
  for( all= TOP; all<MAX; all++)
/w k uD*m(i0  { 
$_e[RD#{s6c0    sum++;SimWer个人空间6oKpsoy`c4u
if( Big[all]>temp )
h&sQ} B6d-}0{
7Z-W6Zc)A/A.]4n'M*n0     
M#t gd]s R$abg|-M0sum++;SimWer个人空间9[ r"Kd*m"/D@
SimWer个人空间#u$jz l}+_:~ {i
pSort[i++] = Big[all];SimWer个人空间M*P-H9]] }!o4J
     SimWer个人空间 {u#{%q:{4d
if(i==TOP*2) // i满TOP*2了
;M9];g7f8G"lJ:~0{
_]J-S4Q;j]Mq0sum += 3;SimWer个人空间 L AG7w1F)v
i = 0;SimWer个人空间$M./ao8Q1B,aIi
j = TOP*2;SimWer个人空间r!q-ux[8I}
int temp2 = pSort[TOP*2-1];SimWer个人空间Vl3YR2M

2ZI G&P5`6g@x&O0for(int n=0; n< TOP*2-1; n++)
t4r'`M { ZW+W0{
2q'in^0` Q#F0sum += 2;SimWer个人空间3qG~1m9A+Sgv/hs

bjjy ^{0if(pSort[n]> temp2)SimWer个人空间+U,eo%`s^0r3i)n)S y
{
/ G@'y'~4I0if(i!=n)pSort[i] = pSort[n]; //大的放到pSort前部分
.f*K6]/G N#XMg0i++;SimWer个人空间y}4jxC+Gr*F3T
}SimWer个人空间"ce�}@cQ
else
KuI:o7dzL x)P0{
!g-WF-x-|9C9x0pSort[j++] = pSort[n]; //小的放到pSort后部分
4S2V�uX]"Z0}SimWer个人空间GYy:N9@
SimWer个人空间uOx.w:bSW
}SimWer个人空间;^KH$ZB

&J5~Z.d0b'~h:k.D*Obl0if(i<TOP)//i<100,选的分割数比较大, 重新选择排在100名后的作为分割数SimWer个人空间5/!hLy` l5q
{
WV-D7Vz}/hg#x0while(i<TOP)SimWer个人空间n2J$~A,m PT
{SimWer个人空间9?+EK,Tzpww|
sum += 5;
r e9d!FB)`|1h0
5@6@0O%`F1Mi%B0pSort[i++] = temp2;SimWer个人空间T O&|D@8~-d;KbX,o
j--;SimWer个人空间@KY*]7_,A8o4`�R
temp2 = pSort[j];
[7wu9g6Kzx9W vi,[0k = TOP*2;
W8/&r+m [a o^@0h = TOP*2;
E!Z nv(z9A0for( ;k<j;k++)SimWer个人空间Vq!jt6i f/eB
{
5K�V@K5Q-ro0sum += 2;
-U2a-b)pL0SimWer个人空间jp+_+y,Vc9@&Y h]q1K
if(pSort[k]>temp2)SimWer个人空间fb a:C!p ^/7ew
{SimWer个人空间{F*v^;i@
pSort[i++] = pSort[k];
Qr^$UZj;QsZ;l0}
oS&yf_b.Pc9GA0else
P6R XP_'Fv ?(bM0{
Nc:bu V Ff;f0if(h!=k) pSort[h] = pSort[k];
:Y E jdQWW j*eo0h++;SimWer个人空间J*lnk]7FC1K
}SimWer个人空间:k0Knx1KV/G{
}SimWer个人空间3xXC ?)bS^bd
j = h;
Dk7s:a3?U1G0} //i>100了,选择排在100名后的分割数的操作完毕
4H@-P�M2S/Y7@0}SimWer个人空间/�^}zTA
sum++;
RUQuG0temp = temp2;SimWer个人空间#S�tr1R P2V
}SimWer个人空间/]LB%/ E!l&E!I3H
}SimWer个人空间4p9V`x0`#D]
  }
d w-UK F0
#s$kxzp0  cout<<endl<<sum<<""<<i<<" "<<j<<endl; 
A&M/ M"u:G;`(S5Z+}0 SimWer个人空间 mesWb.j]#sP9?
///////这里是全排序输出前TOP个,看看后面的结果是否和这个相同,但必须在MAX值比较小才可以执行,否则堆栈溢出/////SimWer个人空间!MFY0JNN/W
/*
)m$^U-u(nm0  quicksort(Big,0,MAX-1);
w5U*N,GzwCO0SimWer个人空间J'^-//w wj gH
  for(k=0; k<TOP; k++)cout<<Big[k]<<"";SimWer个人空间�Li6}0x8T;g.n Jo'g,oh3{
  cout<<endl;
tzz(W^,RD0  cout<<endl;SimWer个人空间8s2EIw8X R1N4g v
*/
K4Ebs,R-X0 //////////////////////////////////////////SimWer个人空间3x:v3w_ar[cdz

4o OZ"t D Pgf T0  //输出前TOP个
N l,~0I![(O.j&A8V_0  quicksort(pSort,0,i-1);SimWer个人空间]+z/5es[
  for( k =0;k<TOP;k++) cout<<pSort[k]<<"";SimWer个人空间,q i R8A(Ts]IS
SimWer个人空间E*e^7y-LvI?'CW^;B
  getchar( );SimWer个人空间qnU.e:U
  delete[ ] Big;
r$bTR,z+s8x1r]*A0  delete[ ] pSort;
^qo!Bw3@0  return 0;SimWer个人空间L4Dyv%v~A.iY
}SimWer个人空间y,H m9f%m"`
SimWer个人空间Ff$aF%W(rtp!fW
SimWer个人空间sA/Mn rR Y

r9e j hL:VQ^7Na0
$RH$GHb%s0SimWer个人空间+{,Mk)dF%I~$C
算法的题不难啊。
4B.Ft@F+D4Y/s&zp Q$d0我说个思路吧:
:[7s C/|)?+C$R01、线形表a、b为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表h;
5?-B}!U @3Z:I0    这个问题和下面那个第一题本质是一样的,我==一起说。
-fw4e1D9P0SimWer个人空间7Qx0dhP+|9h
3、用递归算法判断数组a[N]是否为一个递增数组。
5aqc]#}3?Gp0    这个就是每次拿最后一个和边界上的比下缩小规模,没难度。SimWer个人空间{.RDi7u

l_Tov#z9Z%i ]D04、编写算法,从10亿个浮点数当中,选出其中最大的10000个。
3o/Z9j1`f"T0    外部排序SimWer个人空间i3yi ^%Q8_U+o

Z] F]pZ+fn,s i05、编写一unix程序,防止僵尸进程的出现.SimWer个人空间2H*e ]"Lt.|/f4c2y#^ _
    和算法没关系。我不会。
I.LY fZ|/h1/~4B0
h g E/Vf�Y L?01.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,并且返回交集个数SimWer个人空间3A-T2e.N2U"?
    先排序O(N*LOG(N)),然后进行的步骤和第一题一样就对了。对这题是:取小头,比较,一样进内存,不一样小的扔O(N)内完成。加上排序O(N*LOG(N))搞定。SimWer个人空间/EjL/W W-U
对上面那题  不用讲应该都知道了,就是比完合并就行了。 SimWer个人空间w%?,P-{A

@z `�Z^z02.单连表的建立,把'a'--'z'26个字母插入到连表中,并且倒叙,还要打印!
u;H;[ Gn)Y0    链表是基本功,没什么好说的。SimWer个人空间eb)L1K/@F@ h"{
SimWer个人空间 L$|Pu'?h
象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,
F&V4O8Wz)Z-M;~0请描述思想,写出算发(c语言),空间和时间复杂度,SimWer个人空间M q_$F(tua
    我不知道。不过你算下就知道空间肯定是够的:全部装入都够(当然我们不会这么做)
6VCK xda04.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度,
-lm$j;N e�B!r y.T s J0    我不知道。没学过着方面知识
[D-QjR6Fm0SimWer个人空间Z@3C6Ps[6Mg
SimWer个人空间7PR8_(NAC6t!mC
SimWer个人空间p$A b*]f%fsw;x1k{
SimWer个人空间j|XZSE
楼上几个朋友回排序的,我们一起来讨论一个问题。
-w r3wZQ t c0结果要求的是10000个排好顺序的数而已,并没有要求你把10亿个数都拿出来排序。SimWer个人空间5OqeNap0?:v
所以更有效率的思路应当是SimWer个人空间cEN!D:Ak#z
1、读入的头10000个数,直接创建二叉排序树。O(1)
]zv%Z'|Xom�~02、对以后每个读入的数,比较是否比前10000个数中最小的大。(N次比较)如果小的话接着读下面的数。O(N)
'w^D$M[-c03、如果大,查找二叉排序树,找到应当插入的位置。SimWer个人空间aB6r!Si/`!/H
4、删除当前最小的结点。SimWer个人空间 LekXmx]@
5、重复步骤2,直到10亿个数全都读完。SimWer个人空间b{F$d"o,f c D)R
6、按照中序遍历输出当前二叉排序树中的所有10000个数字。SimWer个人空间 {R&@` ac6g R
基本上算法的时间复杂度是O(N)次比较SimWer个人空间+CrZ$z.d
算法的空间复杂度是10000(常数)SimWer个人空间2WT-DOx9hh
SimWer个人空间aU'XV^%]�} U/?y
SimWer个人空间{s_}!U/A W:U*@B
SimWer个人空间'XB}D0E5e1X@s5zu/[
SimWer个人空间,`!XZ'WDe(B,G
我来回答后面两道“难题”吧:SimWer个人空间"i*F n"cj[ xJ
1. 最近时有公司出这种从几百万词条中找出频率最大的前几条或者重复的条目的问题。SimWer个人空间 C5R*{Q]a2N
对于这种问题实际上并不需要太多所谓的搜索专业知识,想想数据库是怎么实现或者数据结构中关于词典索引的章节就不难知道,这些题目的解决办法不外乎,采用二种数据结构:
i l!M ADlM0树(二叉树,Trie树和B树)和哈希表。对于300万词条来说,构建一个开地址哈希肯定用不了1G内存,如果还不放心,就构建一棵Trie树,如果还怕内存不够就构建B+树进行多级索引。至于复杂度分析,稍微回忆一下你的数据结构书吧。SimWer个人空间+u.t h'D&fNu+f
2.类似贴吧的设计无非是个多级索引,查询与更新问题。
I yb+Y_CDX0一级是个主题,10多万主题为了效率直接哈希就成,查询时候这些主题肯定是要全部载入内存的;SimWer个人空间.i6u*~.wl9y
二 级索引是上亿数据,查询或者更新时内存肯定不能放呀,自然就要用B+树。稍微补充一下,为啥要用B+树就是为了解决内存中不能载入全部数据的时候用来分级 载入数据,这样可以充分利用内存的换入换出来解决海量数据操作的问题。这和操作系统的文件系统设计以及数据库实现原理是相似的。SimWer个人空间!Eb*SSWbbNe#Q

f0y {8z4lvv0SimWer个人空间Im(i"vYv2|Hf

's4Q'V qK]'F4Sv04、编写算法,从10亿个浮点数当中,选出其中最大的10000个。
j;Oq?"x3A.V0SimWer个人空间3{&]Q7q0VaOLr z$p
记得, 排序算法的时间复杂度是O(N*log N), 这个是最快了SimWer个人空间M/MO%|J&_ t(@
但是这个地方时间复杂度是 O(N*log n),
l8W1YF+O@5H%bzCb0其中N 是 1G, n 是 10K 大概是: 30/13
Fi$F!s,vJjku0除此之外, 这个地方还不需要使用耗时巨大的外排序SimWer个人空间Wd u'CS0w
像对于磁盘访问远远慢于内存访问的常规系统来说, 效率不在一个数量级。SimWer个人空间@-Do,b6J9yvDE

5w"xLr Ad#`6l0class CSearchSimWer个人空间;j)Au*M)]"[
{SimWer个人空间l)D2r7H9Q-L
public:
b6|OO.}#[9O�FW0    void Input(float f)SimWer个人空间SV B-pk$?t{_
    {
5p P3z+bS"R&EA0        if ( m_vBuf.size() < 10000 || f > *m_vBuf.begin() )
n5uQ#lav0        {
#~tBK(R:j0            m_vBuf.insert(f);       // log(2, n) 时间复杂度SimWer个人空间X&`:Tk$IT7A.U
            if ( m_vBuf.size() > 10000 )SimWer个人空间$X-i].T5}8@ Y)U
                m_vBuf.erase(m_vBuf.begin());
.fb$[5q3k9kZ@{'c%E0        }SimWer个人空间A4}g?!`)H
     }
4J;r zrB m%aOr0
X8A;P.p,L8c0T4~ k0    std::set<float> m_vBuf;
'cFZzMC'|(z0};SimWer个人空间eC$| X@(u*v

ZL3y(W/o M|5_0剩下的, 就是把所有数据过一遍这边就OK了。SimWer个人空间?8g6@zAc9YI
SimWer个人空间7?7@8D)Z8Z3a ih#aI ^?

vv�r7OW0x0
.D k2c+dM%JX@0

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1688647

 
原创粉丝点击