- 相關(guān)推薦
計算機專業(yè)求職面試問題
1、線形表a、b為兩個有序升序的線形表,編寫一程序,使兩個有序線形表合并成一個有序升序線形表h;
2、運用四色定理,為N個局域舉行配色,顏色為1、2、3、4四種,另有數(shù)組adj[][N],如adj[i][j]=1則表示i區(qū)域與j區(qū)域相鄰,數(shù)組color[N],如color[i]=1,表示i區(qū)域的顏色為1號顏色。
3、用遞歸算法判斷數(shù)組a[N]是否為一個遞增數(shù)組。
4、編寫算法,從10億個浮點數(shù)當(dāng)中,選出其中最大的10000個。
5、編寫一unix程序,防止僵尸進程的出現(xiàn).
同學(xué)的4道面試題,應(yīng)聘的職位是搜索引擎工程師,后兩道超級難,(希望大家多給一些算發(fā))
1.給兩個數(shù)組和他們的大小,還有一動態(tài)開辟的內(nèi)存,求交集,把交集放到動態(tài)內(nèi)存dongtai,并且返回交集個數(shù)
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
2.單連表的建立,把'a'--'z'26個字母插入到連表中,并且倒敘,還要打印!
3.可怕的題目終于來了
象搜索的輸入信息是一個字符串,統(tǒng)計300萬輸入信息中的最熱門的前十條,我們每次輸入的一個字符串為不超過255byte,內(nèi)存使用只有1G,
請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
4.國內(nèi)的一些帖吧,如baidu,有幾十萬個主題,假設(shè)每一個主題都有上億的跟帖子,怎么樣設(shè)計這個系統(tǒng)速度最好,請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
時間問題,我不發(fā)代碼了,但這些問題書上都有,我給你說一下書名
1、線形表a、b為兩個有序升序的線形表,編寫一程序,使兩個有序線形表合并成一個有序升序線形表h;
答案在 請化大學(xué) 嚴(yán)銳敏《數(shù)據(jù)結(jié)構(gòu)第二版》第二章例題(有錯字不好意思 下同)
2、運用四色定理,為N個局域舉行配色,顏色為1、2、3、4四種,另有數(shù)組adj[][N],如adj[i][j]=1則表示i區(qū)域與j區(qū)域相鄰,數(shù)組color[N],如color[i]=1,表示i區(qū)域的顏色為1號顏色。
答案在 中國水利出版社 引進的一套國外《數(shù)據(jù)結(jié)構(gòu)》教材上,單蘭色的封皮(這套書包括操作系統(tǒng)(利用的minux),多媒體都有,估計有年歲了)
3、用遞歸算法判斷數(shù)組a[N]是否為一個遞增數(shù)組。
這個我沒在教才上看到過 但不難。
一會貼代碼
4、編寫算法,從10億個浮點數(shù)當(dāng)中,選出其中最大的10000個。
用外部排序,在《數(shù)據(jù)結(jié)構(gòu)》書上有。!
5、編寫一unix程序,防止僵尸進程的出現(xiàn).
你說的 僵尸進程 是死鎖嗎?unix程序我不會
1.給兩個數(shù)組和他們的大小,還有一動態(tài)開辟的內(nèi)存,求交集,把交集放到動態(tài)內(nèi)存dongtai,并且返回交集個數(shù)
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
這個我沒在教才上看到過 但不難!
一會貼代碼
2.單連表的建立,把'a'--'z'26個字母插入到連表中,并且倒敘,還要打。
這個有點讀不懂
3.可怕的題目終于來了
象搜索的輸入信息是一個字符串,統(tǒng)計300萬輸入信息中的最熱門的前十條,我們每次輸入的一個字符串為不超過255byte,內(nèi)存使用只有1G,
請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
的確可怕,
4.國內(nèi)的一些帖吧,如baidu,有幾十萬個主題,假設(shè)每一個主題都有上億的跟帖子,怎么樣設(shè)計這個系統(tǒng)速度最好,請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度.
的確可怕,
1、線形表a、b為兩個有序升序的線形表,編寫一程序,使兩個有序線形表合并成一個有序升序
二路歸并,不難
2、運用四色定理,為N個局域舉行配色,顏色為1、2、3、4四種,另有數(shù)組adj[][N],如adj[i][j]=1則表示i區(qū)域與j區(qū)域相鄰,數(shù)組color[N],如color[i]=1,表示i區(qū)域的顏色為1號顏色。
可轉(zhuǎn)化位圖論問題,將各個區(qū)域視為圖上的點,相鄰的點之間連上一條線,構(gòu)成一個無向圖,可得其鄰接矩陣,根據(jù)鄰接矩陣得色數(shù).
3、用遞歸算法判斷數(shù)組a[N]是否為一個遞增數(shù)組。
樓上有正解
4、編寫算法,從10億個浮點數(shù)當(dāng)中,選出其中最大的10000個。
用快排.可先從10億個浮點數(shù)當(dāng)中選出第10000大的數(shù),設(shè)位M,在選M位基值,利用一趟快速排序,M
之后的數(shù)即為所求.
1.給兩個數(shù)組和他們的大小,還有一動態(tài)開辟的內(nèi)存,求交集,把交集放到動態(tài)內(nèi)存dongtai,并且返回交集個數(shù)
long jiaoji(long* a[],long b[],long* alength,long blength,long* dongtai[])
我想到的是蠻力法,時間復(fù)雜度位O(alength*blength);想必大家都知道了!
2.單連表的建立,把'a'--'z'26個字母插入到連表中,并且倒敘,還要打!
在創(chuàng)建單鏈表的時候使之逆序,不難.
3.可怕的題目終于來了
象搜索的輸入信息是一個字符串,統(tǒng)計300萬輸入信息中的最熱門的前十條,我們每次輸入的一個字符串為不超過255byte,內(nèi)存使用只有1G,
請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
255byte*300萬<1G;也就是說可全部調(diào)進輸入信息,利用PAGERANK算法實行頻率統(tǒng)計,排序即可.
注:PAGERANK算法受google專利保護,看不到源代碼.
1、線形表a、b為兩個有序升序的線形表,編寫一程序,使兩個有序線形表合并成一個有序升序線形表h;
已知:a[0]<a[1] ...a[n-1]<a[n];
b[0]<b[1] ...b[n-1]<b[n];
一、a[n]<b[0]
二、b[n]<a[0]
三、插入排序&&二分排序
#include "http://emrowgh.com"
#include "http://emrowgh.com"
main()
{
int i,j,k;
int h[20];
int a[10]={2,5,6,9,11,24,56,78,80,81};
int b[10]={1,3,8,7,10,21,32,45,65,79};
i=0;
j=0;
for(k=0;k<20;k++)
if(a[i]>b[j])
{ h[k]=b[j];j++;}
else
{ h[k]=a[i];i++;}
for(i=0;i<20;i++)
printf("%d ",h[i]);
getch();
}
//單連表的建立,把'a'--'z'26個字母插入到連表中,并且倒敘,還要打!
node *p = NULL;
node *q = NULL;
node *head = (node*)malloc(sizeof(node));
head->data = ' ';head->next=NULL;
node *first = (node*)malloc(sizeof(node));
first->data = 'a';first->next=NULL;head->next = first;
p = first;
int longth = 'z' - 'b';
int i=0;
while ( i<=longth )
{
node *temp = (node*)malloc(sizeof(node));
temp->data = 'b'+i;temp->next=NULL;q=temp;
head->next = temp; temp->next=p;p=q;
i++;
}
print(head);
其實第四題這樣的題目樓上沒有人說對。
說是從10億個數(shù)中選,實際上是說數(shù)很多。當(dāng)然用外部排序是一個方法。
估計想考的是看你會不會二叉排序樹。
10000個最大的數(shù),就是10000個結(jié)點,這個內(nèi)存是可以裝下的。
但10億個數(shù)就要從外部文件讀出來了。每讀入一個/組,就試圖將之放入排序樹中。等10億個數(shù)全讀完了,10000個結(jié)點按中序輸出就行了。
我還在CSDN中見過類似的題目,答案也是二叉排序樹,好像沒人回答出來。
象搜索的輸入信息是一個字符串,統(tǒng)計300萬輸入信息中的最熱門的前十條,我們每次輸入的一個字符串為不超過255byte,內(nèi)存使用只有1G,
請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
這道題不是很難吧,用哈希的方法,將這些字符串哈希到不同的桶中,然后判斷那個最多就行了
關(guān)于第4題的我寫的程序
#include <http://emrowgh.com
#include <iostream>
#define MAX 1000000 //設(shè)置總數(shù),我這里設(shè)置了一百萬,也可以到一千萬,一億的話內(nèi)存受不了,但是我的程序是串行讀出數(shù)據(jù)的,所以也是可以處理更大的數(shù)據(jù)的,這里全部放在數(shù)據(jù)里是為了方便
#define TOP 1000
void quicksort(int array[ ],int left,int right)
{
if(left < right)
{
int div = array[right];
int i = left;
int j = right-1;
int temp;
if(i==j){//只有兩個數(shù)據(jù),直接處理完了事
if(array[i] < div)
{
array[i+1] = array[i] ;
array[i] = div;
return;
}
}
else
{
while(i< j)
{
for( ; array[i] > div ; i++);
for( ; array[j] <= div ; j--);
if(i>=j)break;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
if(i!=right)
{
array[right] = array[i];
array[i] = div;
}
quicksort(array,left,i-1);
quicksort(array,i+1,right);
}
}
}
int main()
{
int *Big = new int[MAX];
int * pSort = new int[TOP*4];//最好pSort[0]-pSort[Top-1]為結(jié)果
int i=0, j=TOP, k=0;
int h=0;
int all = 0;//Big數(shù)據(jù)計數(shù)器
srand(time(NULL));
for( i =0; i< MAX; i++)
{
//int jj= rand( )%77 + 1;
//int nn = rand( )%jj;
Big[i] = rand( );
//cout<<Big[i]<<" ";
}
//可加入一些測試數(shù)據(jù),看看大的能否排到前面
Big[0] = 100000;
Big[10] =300002;
Big[11] =200002;
Big[MAX-2] =200007;
int temp = Big[0];
for( all = 0; all < TOP; all++)
{
pSort[all] = Big[all];
}
quicksort(pSort,0,TOP-1);
//for( k =0;k<TOP-1;k++) cout<<pSort[k]<<"";
//cout<<endl;
temp = pSort[TOP-1];
i = TOP-1;
j = TOP*2;
int sum = 0;
for( all= TOP; all<MAX; all++)
{
sum++;
if( Big[all]>temp )
{
sum++;
pSort[i++] = Big[all];
if(i==TOP*2) // i滿TOP*2了
{
sum += 3;
i = 0;
j = TOP*2;
int temp2 = pSort[TOP*2-1];
for(int n=0; n< TOP*2-1; n++)
{
sum += 2;
if(pSort[n]> temp2)
{
if(i!=n)pSort[i] = pSort[n]; //大的放到pSort前部分
i++;
}
else
{
pSort[j++] = pSort[n]; //小的放到pSort后部分
}
}
if(i<TOP)//i<100,選的分割數(shù)比較大, 重新選擇排在100名后的作為分割數(shù)
{
while(i<TOP)
{
sum += 5;
pSort[i++] = temp2;
j--;
temp2 = pSort[j];
k = TOP*2;
h = TOP*2;
for( ;k<j;k++)
{
sum += 2;
if(pSort[k]>temp2)
{
pSort[i++] = pSort[k];
}
else
{
if(h!=k) pSort[h] = pSort[k];
h++;
}
}
j = h;
} //i>100了,選擇排在100名后的分割數(shù)的操作完畢
}
sum++;
temp = temp2;
}
}
}
cout<<endl<<sum<<""<<i<<" "<<j<<endl;
///////這里是全排序輸出前TOP個,看看后面的結(jié)果是否和這個相同,但必須在MAX值比較小才可以執(zhí)行,否則堆棧溢出/////
/*
quicksort(Big,0,MAX-1);
for(k=0; k<TOP; k++)cout<<Big[k]<<"";
cout<<endl;
cout<<endl;
*/
//////////////////////////////////////////
//輸出前TOP個
quicksort(pSort,0,i-1);
for( k =0;k<TOP;k++) cout<<pSort[k]<<"";
getchar( );
delete[ ] Big;
delete[ ] pSort;
return 0;
}
算法的題不難啊。
我說個思路吧:
1、線形表a、b為兩個有序升序的線形表,編寫一程序,使兩個有序線形表合并成一個有序升序線形表h;
這個問題和下面那個第一題本質(zhì)是一樣的,我==一起說。
3、用遞歸算法判斷數(shù)組a[N]是否為一個遞增數(shù)組。
這個就是每次拿最后一個和邊界上的比下縮小規(guī)模,沒難度。
4、編寫算法,從10億個浮點數(shù)當(dāng)中,選出其中最大的10000個。
外部排序
5、編寫一unix程序,防止僵尸進程的出現(xiàn).
和算法沒關(guān)系。我不會。
1.給兩個數(shù)組和他們的大小,還有一動態(tài)開辟的內(nèi)存,求交集,把交集放到動態(tài)內(nèi)存dongtai,并且返回交集個數(shù)
先排序O(N*LOG(N)),然后進行的步驟和第一題一樣就對了。對這題是:取小頭,比較,一樣進內(nèi)存,不一樣小的扔O(N)內(nèi)完成。加上排序O(N*LOG(N))搞定。
對上面那題 不用講應(yīng)該都知道了,就是比完合并就行了。
2.單連表的建立,把'a'--'z'26個字母插入到連表中,并且倒敘,還要打!
鏈表是基本功,沒什么好說的。
象搜索的輸入信息是一個字符串,統(tǒng)計300萬輸入信息中的最熱門的前十條,我們每次輸入的一個字符串為不超過255byte,內(nèi)存使用只有1G,
請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
我不知道。不過你算下就知道空間肯定是夠的:全部裝入都夠(當(dāng)然我們不會這么做)
4.國內(nèi)的一些帖吧,如baidu,有幾十萬個主題,假設(shè)每一個主題都有上億的跟帖子,怎么樣設(shè)計這個系統(tǒng)速度最好,請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
我不知道。沒學(xué)過著方面知識
樓上幾個朋友回排序的,我們一起來討論一個問題。
結(jié)果要求的是10000個排好順序的數(shù)而已,并沒有要求你把10億個數(shù)都拿出來排序。
所以更有效率的思路應(yīng)當(dāng)是
1、讀入的頭10000個數(shù),直接創(chuàng)建二叉排序樹。O(1)
2、對以后每個讀入的數(shù),比較是否比前10000個數(shù)中最小的大。(N次比較)如果小的話接著讀下面的數(shù)。O(N)
3、如果大,查找二叉排序樹,找到應(yīng)當(dāng)插入的位置。
4、刪除當(dāng)前最小的結(jié)點。
5、重復(fù)步驟2,直到10億個數(shù)全都讀完。
6、按照中序遍歷輸出當(dāng)前二叉排序樹中的所有10000個數(shù)字。
基本上算法的時間復(fù)雜度是O(N)次比較
算法的空間復(fù)雜度是10000(常數(shù))
我來回答后面兩道“難題”吧:
1. 最近時有公司出這種從幾百萬詞條中找出頻率最大的前幾條或者重復(fù)的條目的問題。
對于這種問題實際上并不需要太多所謂的搜索專業(yè)知識,想想數(shù)據(jù)庫是怎么實現(xiàn)或者數(shù)據(jù)結(jié)構(gòu)中關(guān)于詞典索引的章節(jié)就不難知道,這些題目的解決辦法不外乎,采用二種數(shù)據(jù)結(jié)構(gòu):
樹(二叉樹,Trie樹和B樹)和哈希表。對于300萬詞條來說,構(gòu)建一個開地址哈?隙ㄓ貌涣1G內(nèi)存,如果還不放心,就構(gòu)建一棵Trie樹,如果還怕內(nèi)存不夠就構(gòu)建B+樹進行多級索引。至于復(fù)雜度分析,稍微回憶一下你的數(shù)據(jù)結(jié)構(gòu)書吧。
2.類似貼吧的設(shè)計無非是個多級索引,查詢與更新問題。
一級是個主題,10多萬主題為了效率直接哈希就成,查詢時候這些主題肯定是要全部載入內(nèi)存的;
二 級索引是上億數(shù)據(jù),查詢或者更新時內(nèi)存肯定不能放呀,自然就要用B+樹。稍微補充一下,為啥要用B+樹就是為了解決內(nèi)存中不能載入全部數(shù)據(jù)的時候用來分級 載入數(shù)據(jù),這樣可以充分利用內(nèi)存的換入換出來解決海量數(shù)據(jù)操作的問題。這和操作系統(tǒng)的文件系統(tǒng)設(shè)計以及數(shù)據(jù)庫實現(xiàn)原理是相似的。
4、編寫算法,從10億個浮點數(shù)當(dāng)中,選出其中最大的10000個。
記得, 排序算法的時間復(fù)雜度是O(N*log N), 這個是最快了
但是這個地方時間復(fù)雜度是 O(N*log n),
其中N 是 1G, n 是 10K 大概是: 30/13
除此之外, 這個地方還不需要使用耗時巨大的外排序
像對于磁盤訪問遠(yuǎn)遠(yuǎn)慢于內(nèi)存訪問的常規(guī)系統(tǒng)來說, 效率不在一個數(shù)量級。
class CSearch
{
public:
void Input(float f)
{
if ( m_http://emrowgh.com() < 10000 || f > *m_http://emrowgh.com() )
{
m_http://emrowgh.com(f); // log(2, n) 時間復(fù)雜度
if ( m_http://emrowgh.com() > 10000 )
m_http://emrowgh.com(m_http://emrowgh.com());
}
}
std::set<float> m_vBuf;
};
剩下的, 就是把所有數(shù)據(jù)過一遍這邊就OK了。
【計算機專業(yè)求職面試問題】相關(guān)文章:
環(huán)境專業(yè)面試的問題06-01
求職面試的各種問題05-18
招聘專員面試專業(yè)問題03-22
化工專業(yè)面試問題05-24
求職面試中哪些問題千萬問不得06-06
最全的面試經(jīng)典問題05-01
面試問題05-01
面試經(jīng)典問題整理05-01
面試經(jīng)典問題及答案03-30
面試中的問題06-05