
題目:http://wenku.baidu.com/view/602da2d4240c844769eaee55.html
1.-7的二進制補碼 (D)
(1)-7的原碼 1000 0111
(2)符號位不變 1000 0111
(3)數值位取反 1111 1000
(4)加1 1111 1001
注意:
(1)正整數的補碼與原碼相同
(2)補碼轉化為原碼
補碼的符號位為‘0’,原碼就補碼
補碼的符號位為‘1’,原碼就是補碼的補碼
2.四種介質,帶寬最大:(C)
A 同軸電纜 B 雙絞線 C 光纖 D 同步線
注:
(1)雙絞線也稱為雙扭線,是最古老但又最常用的傳輸媒體。把兩根互相絕緣的銅導線並排放在一起,然后用規則的方法絞合起來(這樣做是為了減少相鄰的導線的電磁干擾)而構成雙絞線.
雙絞線分為1類到5類,局域網中常用的為3類,4類和5類雙絞線。 3類線用於語音傳輸及最高傳輸速率為 10Mbps的數據傳輸;4類線用於語音傳輸和最高傳輸速率為 16Mbps的數據傳輸;5類線用於語音傳輸和最高傳輸速率為 100Mbps的數據傳輸
(2)同軸電纜由內導體銅質芯線,絕緣層,網狀編制的外導體屏蔽層及保護塑料外層組成 ,內導體和外導體構成一組線對。由於外導體屏蔽層的作用,同軸電纜具有很好的抗干擾性。
同軸電纜可以將 10Mb/S的基帶數字信號傳送1千米到 1.2千米,因此被廣泛用於局域網中
(3)光纖通信就是利用光導纖維傳遞光脈沖來進行通信,而光導纖維是光纖通信的媒體。光纖在任何時間都只能單向傳輸,因此,要實行雙向通信,它必須成對出現,一個用於輸入,一個用於輸出,光纖兩端接到光學接口上。
光纖的傳輸系統比同軸電纜大的多,一般小同軸電纜的最大傳輸帶寬為 20MHz左右,中同軸電纜的最大傳輸帶寬為 60MHz左右。單根光導纖維的數據傳輸速率能達幾Gbps,在不使用中繼器的情況下,傳輸距離能達幾十公里。
3. 進程阻塞原因 (A)
A.時間片切換 B.等待I/O C.進程sleep D.等待解鎖
如果沒有時間片輪轉,那么進程就沒法切換了,一個進程將獨享CPU。但是不能稱時間片切換導致進程阻塞。
注:
(1)進程,概念主要有兩點:
第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。
文本區域存儲處理器執行的代碼;
數據區域存儲變量和進程執行期間使用的動態分配的內存;
堆棧區域存儲着活動過程調用的指令和本地變量。
第二,進程是一個“執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
(2)進程的三種基本狀態
進程在運行中不斷地改變其運行狀態。通常,一個運行進程必須具有以下三種基本狀態。
就緒(Ready)狀態 當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的進程狀態稱為就緒狀態。
執行(Running)狀態當進程已獲得處理機,其程序正在處理機上執行,此時的進程狀態稱為執行狀態。
阻塞(Blocked)狀態 正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起進程阻塞的事件可有多種,例如,等待I/O完成、申請緩沖區不能滿足、等待信件(信號)等。
進程三種狀態間的轉換
一個進程在運行期間,不斷地從一種狀態轉換到另一種狀態,它可以多次處於就緒狀態和執行狀態,也可以多次處於阻塞狀態。圖3_4描述了進程的三種基本狀態及其轉換。
(1) 就緒→執行 處於就緒狀態的進程,當進程調度程序為之分配了處理機后,該進程便由就緒狀態轉變成執行狀態。
(2) 執行→就緒 處於執行狀態的進程在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理機,於是進程從執行狀態轉變成就緒狀態。
(3) 執行→阻塞 正在執行的進程因等待某種事件發生而無法繼續執行時,便從執行狀態變成阻塞狀態。
(4) 阻塞→就緒 處於阻塞狀態的進程,若其等待的事件已經發生,於是進程由阻塞狀態轉變為就緒狀態。
4.設只含根節點的二叉樹高度為1,現有一顆高度為h(h>1)的二叉樹上只有出度為0和出度為2的節點,那么這顆二叉樹節點最少為:
A.2^h-1 B.2h-1 C.2h D.2h+1
取H=1 則可以排除C和D
有個討巧的方法:直接取h=3,畫個圖看下,顯然是5,所以答案為B。
下面來分析下:如果每個節點出度要么為0要么為2,那么也就是要么自己為葉子,要么自己擁有左右兒子。那么什么情況下節點最少呢?直接沿着一條路下去保持出度為2,直到高度達到h,那么此時節點總數:2h-1。
5.給定下面程序,那么執行printf("%d\n",foo(20,13));結果是多少:
- int foo(int x,int y)
- {
- if(x <= 0 || y <= 0)return 1;
- return 3*foo(x-6,y/2);
- }
A.3 B.9 C.27 D.81
解:foo(20,13)->3*foo(14,6)->9*foo(8,3)->27*foo(2,1)->81foo(-4,0)=81
6.對於以下說法錯誤的是:
A.Dijkstra是求兩點間最短路徑的,復雜度:O(n^2)。
B.Floyd-Warshall是求所有點對之間最短路徑的,復雜度:O(n^3)。
C.求n個數中的中位數復雜度最低為:O(n*logn)。
D.基於比較的排序算法復雜度下界為:O(n*logn)。
注:
(1)Dijkstra
一個按路徑長度遞增的次序產生最短路徑的算法。
該算法的基本思想是:
設置兩個頂點的集合S和T=V-S,集合S中存放已找到最短路徑的頂點,集合T存放當前還未找到最短路徑的頂點。初始狀態時,集合S中只包含源點v0,然后不斷從集合T中選取到頂點v0路徑長度最短的頂點u加入到集合S中,集合S每加入一個新的頂點u,都要修改頂點v0到集合T中剩余頂點的最短路徑長度值,集合T中各頂點新的最短路徑長度值為原來的最短路徑長度值與頂點u的最短路徑長度值加上u到該頂點的路徑長度值中的較小值。此過程不斷重復,直到集合T的頂點全部加入到S中為止。
偽代碼:
1 function Dijkstra(G, w, s)
2 for each vertex v in V[G] // 初始化
3 d[v] := infinity
4 previous[v] := undefined
5 d[s] := 0
6 S := empty set
7 Q := set of all vertices
8 while Q is not an empty set // Dijstra算法主體
9 u := Extract_Min(Q)
10 S := S union {u}
11 for each edge (u,v) outgoing from u
12 if d[v] > d[u] + w(u,v) // 拓展邊(u,v)
13 d[v] := d[u] + w(u,v)
14 previous[v] := u
如果我們只對在s和t之間尋找一條最短路徑的話,我們可以在第9行添加條件如果滿足u=t的話終止程序。
現在我們可以通過迭代來回溯出s到t的最短路徑
1 S := empty sequence
2 u := t
3 while defined u
4 insert u to the beginning of S
5 u := previous[u]
現在序列S就是從s到t的最短路徑的頂點集.
第一個for循環的時間復雜度是O(n),第二個for循環共進行n-1次,每次執行的時間是O(n)。所以總是的時間復雜度是O(n2)。如果用帶權的鄰接表作為有向圖的存儲結構,則雖然修改D的時間可以減少,但由於在D向量中選擇最小的分量的時間不變,所以總的時間仍為O(n2)。
(2)Floyd-Warshall 算法
Floyd-Warshall算法,簡稱Floyd算法,用於求解任意兩點間的最短距離,時間復雜度為O(n^3)。
Floyd-Warshall算法的原理是動態規划。
設Di,j,k為從i到j的只以(1..k)集合中的節點為中間結點的最短路徑的長度。
- 若最短路徑經過點k,則Di,j,k = Di,k,k − 1 + Dk,j,k − 1;
- 若最短路徑不經過點k,則Di,j,k = Di,j,k − 1。
因此,Di,j,k = min(Di,k,k − 1 + Dk,j,k − 1,Di,j,k − 1)。
在實際算法中,為了節約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。
Floyd-Warshall算法的描述如下:
1 void Floyd(){
2 int i,j,k;
3 for(k=1;k<=n;k++)
4 for(i=1;i<=n;i++)
5 for(j=1;j<=n;j++)
6 if(dist[i][k]+dist[k][j]<dist[i][j])
7 dist[i][j]=dist[i][k]+dist[k][j];
8 }
(3)n個數中的中位數復雜度最低多少?
中位數就是一系列數字中,大小處於中間的那個,比方 1 2 3 4 5 的中位數是 3 ,這是奇數的情況,中位數只有一個;如果是 1 2 3 4 5 6 的話,me 們稱 3 為上中位數,4 為下中位數,對於偶數來說是有 2 個,通常不特指的話,就指前一個,也就是上中位數。這里提個小細節,如果是 1 2 3 4 ... n,的中位數(中間的數)是第幾個呢?O__O"…,這個很簡單,但是 maybe 有些人還不大了解,中位數是第 (n+1)/2 的那個,如果是奇數的話,結果正好是個整數;如果是偶數的話,把那個 0.5 去掉吧。
在大小未必有序的 n 個數中尋找第 (n+1)/2 個數,就不是那么容易,當然如果有序就好了。自然而然的,me 們使用一個排序算法來對 n 個數排個序,然后找中位數就可以了;實際如果有序的話,尋找第 k 大的數和尋找中位數應該說是一樣的,都是線性掃描一下,掃描的復雜度 O(n)。排序算法中很出名的一個就是快速排序吧,不過時間復雜度是 O(nlogn),這是平均情況下的,而最壞情況下達到 O(n^2)。如果使用排序來解決中位數問題的話,時間復雜度和排序復雜度一樣,因為對於 O(nlogn) 或是 O(n^2) 來說, +O(n) 和沒有 + 一樣。
尋找中位數的時候使用了快速排序,而是這兩個算法使用了一個同一個預處理結構 —— 划分,然后都是遞歸解決!中位數的也是根據一個數把原來的數划分一下,形成兩部分。如果前半部分足夠長,就在前部分找,否則在后半部分找!(這不僅適合中位數,實際上適合尋找第 k 大的數!!而 select_middle 其實不是來尋找中位數,是在尋找第 nth 大的數,如果 nth == (n+1)/2,這就是中位數!)
尋找中位數的程序,不,是尋找第 k 大數的程序,那樣寫有神馬好處?它的復雜度能低於 O(nlogn) 嗎?!基於划分的求 nth 大的數的那個程序,最壞情況是 O(n^2),平均是 O(n) ! O__O"…
(快速排序和尋找中位數)
(4)基於比較的排序算法復雜度下界為:O(n*logn)
這些基於比較的排序算法最差情況下最好的時間復雜度就是O(nlogn).這點是可以通過決策樹來幫助我們分析證明的。
決策樹這個東西,學過人工智能之類的應該就很熟悉了,就是根據元素比較的不同情況往不同分支走,然后樹將所有可能的情況都包括進去。
舉一個三個元素的例子:<a1,a2,a3>=<9,4,6>

注意這個決策樹的葉子就是n個元素的所有可能排列。一個實例的運行時間就是它走的路徑的長度。所以最
差情況下的運行時間就是決策樹的高度。要證明基於比較的算法最差情況下運行時間是Θ(nlogn),就是要證明決策樹的高度最小就是nlogn
Theorem: 排序n個元素的任意決策樹的高度 Ω(nlgn).
Proof: 上面提到過樹最少要有n!個葉子。而高度為h的二叉樹的葉子數最多是(滿的時候)2h個葉子,即
n!≤2h
h≥lg(n!)
≥ lg ((n/e)n) (Stirling’s formula)
= nlg n–nlg e
= Ω(nlg n)
於是就得到結論,基於比較的排序算法下界是Ω(nlg n)
7.給定一個m行n列的整數矩陣,每行從左到右和每列從上到下都是有序(假設都是升序)的。判斷一個整數k是否在矩陣中出現的最優算法,在最壞情況下的時間復雜度是
A.O(m*n) B.O(m+n) C.O(log(m*n)) D.O(log(m+n))
1 5 | 7 9
4 6 | 10 15
8 11| 12 19
14 16| 18 21
從右上角開始,遍歷每列(小於該列第一個值,即可去除該行)和每行,劍指OFFER上的題目
8.一個包里有5個黑球,10個紅球和17個白球。每次可以從中取兩個球出來,放置在外面。那么至少取多少次,一定出現過取出一對顏色一樣的球。
A.16 B.9 C.4 D.1
極限情況是:前十次每次取1個紅球和1個白球,中間五次,每次取1個黑球和1個白球。最后當第十六次的時候才能取到一對顏色相同的球。所以至少要十六次。
9.選C
最長8位 最短3位, 3位都是1開頭
最短3位有10^2=100種,
四位:10^4=10000,五位:10^5=100000,六位:10^6=1000000,七位:10^7=10000000,八位:10^8=10000000
一位號碼4BITE,
其實是比較前7位,相加 11110101*4*8/4/1024(Kb)/1024(Mb)=42MB 取(50Mb)
討論解:存儲八位需要4byte *10000000(用戶級別)/1024/2014=39MB
10.騎士只說真話,騙子只說假話。下列場景能確定一個騎士、一個騙子的有?
A.甲說:“我們中至少有一個人說真話”,乙什么也沒說。
B.甲說:"我們兩個都是騙子",乙什么也沒說。
C.甲說:“我是個騙子或者乙是個騎士”,乙什么也沒說。
D.甲乙都說:“我是個騎士”。
E.甲說:“乙是個騎士”,乙說:“我們倆一個是騎士一個是騙子”。
分析一下:是道邏輯題。
A.如果甲是騎士,那么因為至少一個人說真話,那么有可能乙也說真話。那么可能甲乙都是騎士。如果甲是騙子,那么沒有一個人說真話,那么都是騙子。排除。
B.如果甲是騎士,那么不可能說這樣的話,因為騎士不會說自己是騙子。那么甲是騙子,甲說的是假話,那么至少一個不是騙子。那么乙就是騎士。可以。
C.如果甲是騎士,那么必然乙也是騎士。不符合。如果甲是騙子,那么必然乙也不是騎士,這句話才能是假的。排除。
D.如果甲乙都是騎士,顯然成立。排除。
E.如果甲是騎士,那么乙也是騎士,與乙說的話矛盾。如果甲是騙子,那么乙必然不是騎士。
11 某服務強求經復雜均衡設備分配到集群A、B、C、D進行處理響應的概率分別是10%、20%、30%、40%,已知測試集所得穩定指標分別是90%,95%,99%,99.9%。現在該服務請求處理失敗,且已排除穩定性意外的問題,那么最有可能在處理該服務請求的集群是:
A. B. C. D.
解:A B 10%*10%,20%*5%,30%*1%,40%*0.1%
12.以下是TCP連接關閉過程中出現的狀態
A.listen B time_wait C last_ack D syn-received
參考這個鏈接 選BC
13.C
甲 出6 乙<6 則甲賠,乙>6 則乙賠
14.沒有一對元素被比較過兩次或者以上,則是節儉算法,下面是節儉排序的算法是:
A.插入排序 B.選擇排序 C 堆排序 D歸並排序
插入排序:插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間復雜度為O(n^2)。每次處理就是將無序數列的第一個元素與有序數列的元素從后往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。
選擇排序:選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。
堆排序 堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,可以利用數組的特點快速定位指定索引的元素。堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特征,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。
(1)用大根堆排序的基本思想
① 先將初始文件R[1..n]建成一個大根堆,此堆為初始的無序區
② 再將關鍵字最大的記錄R[1](即堆頂)和無序區的最后一個記錄R[n]交換,由此得到新的無序區R[1..n-1]和有序區R[n],且滿足R[1..n-1].keys≤R[n].key
③由於交換后新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整為堆。然后再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區間的最后一個記錄R[n-1]交換,由此得到新的無序區R[1..n-2]和有序區R[n-1..n],且仍滿足關系R[1..n-2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調整為堆。
……
直到無序區只有一個元素為止。
(2)大根堆排序算法的基本操作:
① 初始化操作:將R[1..n]構造為初始堆;
② 每一趟排序的基本操作:將當前無序區的堆頂記錄R[1]和該區間的最后一個記錄交換,然后將新的無序區調整為堆(亦稱重建堆)。
歸並操作(merge),也叫歸並算法,指的是將兩個順序序列合並成一個順序序列的方法。將序列每相鄰兩個數字進行歸並操作(merge),形成floor(n/2)個序列,排序后每個序列包含兩個元素將上述序列再次歸並,形成floor(n/4)個序列,每個序列包含四個元素重復步驟2,直到所有元素排序完畢
如 設有數列{6,202,100,301,38,8,1}
初始狀態:6,202,100,301,38,8,1
第一次歸並后:{6,202},{100,301},{8,38},{1},比較次數:3;
第二次歸並后:{6,100,202,301},{1,8,38},比較次數:4;
第三次歸並后:{1,6,8,38,100,202,301},比較次數:4;
總的比較次數為:3+4+4=11;
15.補全下面的快排程序
void qsort(int* array , int Ien){
int value,start,end;
if(len <= 1) return;
value = array[0];
start = 0;
end = len - 1;
while (start < end) {
for (; start < end; --end){
if (array[ end ] < value){
array[ start ++] = array[ end ];
break;
}
}
for (; end > start; ++start){
if (array[ start ] > value){
array [end -- ] = array[ start ];
break;
}
}
array[ start ] =value;
qsort(array, start);
qsort( array+start+1 , len-start-1);
16. 網絡最大流量
17 公司只要一個員工過生日,所有員工 全部放假一天。其余時候員工都沒有假期,必須上班。假設一年365天,每個員工的生日都概率均等地分布在365天,那么,公司雇佣多少員工,可以使公司一年內所有員工的總工作時間期望最大。
一下是偶的詳解:
18
思路
(1) 非正整數
從頭開始判斷 a[0]與0的大小,若a[0]<0 下標加一,
若 a[i]=i ,則輸出a[i], 下標加一;
若 a[i]>i ,中間不需要判斷 直接判斷a[a[i]+1]的值,
循環至最后一個元素。
(2) 正整數 二分查找
19 智商題
鱷魚為偶數時,兩條鱷魚相互制約,只要其中一條鱷魚先發起進攻他就會被吃掉,所以聰明的鱷魚都會處於僵持狀態,怪物安全。
鱷魚為奇數,最先吃怪物的鱷魚在進食過程中,剩余偶數條鱷魚,相互制約,所以第一吃怪物的鱷魚被吃的風險很小,聰明的鱷魚都想第一個吃怪物,所以怪物不安全。
20
瀏覽器首先查詢DNS服務器,將www.taobao.com轉換成ip地址。在不同的地區或者不同的網絡(電信、聯通、移動)的情況下,轉換后的ip地址很可能是不一樣的,這首先涉及到負載均衡的第一步,通過DNS解析域名時將你的訪問分配到不同的入口,同時盡可能保證你所訪問的入口是所有入口中可能較快的一個(這和后文的CDN不一樣)。
通過這個入口成功的訪問了www.taobao.com的實際的入口ip地址。這時產生了一個PV,即Page View,頁面訪問。每日每個網站的總PV量是形容一個網站規模的重要指標。淘寶網全網在平日(非促銷期間)的PV大概是16-25億之間。同時作為一個獨立的用戶,這次訪問淘寶網的所有頁面,均算作一個UV(Unique Visitor用戶訪問)。最近臭名昭著的12306.cn的日PV量最高峰在10億左右,而UV量卻遠小於淘寶網十余倍。
因為同一時刻訪問www.taobao.com的人數過於巨大,所以即便是生成淘寶首頁頁面的服務器,也不可能僅有一台。僅用於生成www.taobao.com首頁的服務器就可能有成百上千台,那么一次訪問時生成頁面的任務便會被分配給其中一台服務器完成。這個過程要保證公正、公平、平均(暨這成百上千台服務器每台負擔的用戶數要差不多),這一很復雜的過程是由幾個系統配合完成,其中最關鍵的便是LVS,Linux Virtual Server,世界上最流行的負載均衡系統之一,正是由目前在淘寶網供職的章文嵩博士開發的。
經過一系列復雜的邏輯運算和數據處理,用於這次給你看的淘寶網首頁的HTML內容便生成成功了。對web前端稍微有點常識的童鞋都應該知道,下一步瀏覽器會去加載頁面中用到的css、js、圖片等樣式、腳本和資源文件。但是可能相對較少的同學才會知道,你的瀏覽器在同一個域名下並發加載的資源數量是有限制的,例如ie6-7是兩個,ie8是6個,chrome各版本不大一樣,一般是4-6個。訪問淘寶網首頁需要加載126個資源,那么如此小的並發連接數自然會加載很久。所以前端開發人員往往會將上述這些資源文件分布在好多個域名下,變相的繞過瀏覽器的這個限制,同時也為下文的CDN工作做准備。
據不可靠消息,在雙十一當天高峰,淘寶的訪問流量最巔峰達到871GB/S。這個數字意味着需要178萬個4mb帶寬的家庭寬帶才能負擔的起,也完全有能力拖垮一個中小城市的全部互聯網帶寬。那么顯然,這些訪問流量不可能集中在一起。並且大家都知道,不同地區不同網絡(電信、聯通等)之間互訪會非常緩慢,但是很少發現淘寶網訪問緩慢。這便是CDN,Content Delivery Network,即內容分發網絡的作用。淘寶在全國各地建立了數十上百個CDN節點,利用一些手段保證訪問的(這里主要指js、css、圖片等)地方是最近的CDN節點,這樣便保證了大流量分散已經在各地訪問的加速。
這便出現了一個問題,那就是假若一個賣家發布了一個新的寶貝,上傳了幾張新的寶貝圖片,那么淘寶網如何保證全國各地的CDN節點中都會同步的存在這幾張圖片供用戶使用呢?這里邊就涉及到了大量的內容分發與同步的相關技術。淘寶開發了分布式文件系統TFS(taobao file system)來處理這類問題。
(終於加載完了淘寶首頁,習慣性的在首頁搜索框中輸入了'毛衣'二字並敲回車,這時你又產生了一個PV,然后,淘寶網的主搜索系統便開始為你服務了。它首先對你輸入的內容基於一個分詞庫進行的分詞操作。眾所周知,英文是以詞為單位的,詞和詞之間是靠空格隔開,而中文是以字為單位,句子中所有的字連起來才能描述一個意思。例如,英文句子I am a student,用中文則為:“我是一個學生”。計算機可以很簡單通過空格知道student是一個單詞,但是不能很容易明白“學”、“生”兩個字合起來才表示一個詞。把中文的漢字序列切分成有意義的詞,就是中文分詞,有些人也稱為切詞。我是一個學生,分詞的結果是:我 是 一個 學生。
進行分詞之后,還需要根據你輸入的搜索詞進行你的購物意圖分析。用戶進行搜索時常常有如下幾類意圖:(1)瀏覽型:沒有明確的購物對象和意圖,邊看邊買,用戶比較隨意和感性。Query例如:”2010年10大香水排行”,”2010年流行毛衣”, “zippo有多少種類?”;(2)查詢型:有一定的購物意圖,體現在對屬性的要求上。Query例如:”適合老人用的手機”,”500元 手表”;(3)對比型:已經縮小了購物意圖,具體到了某幾個產品。Query例如:”諾基亞E71 E63″,”akg k450 px200″;(4)確定型:已經做了基本決定,重點考察某個對象。Query例如:”諾基亞N97″,”IBM T60″。通過對你的購物意圖的分析,主搜索會呈現出完全不同的結果來。
之后的數個步驟后,主搜索系統便根據上述以及更多復雜的條件列出了搜索結果,這一切是由一千多台搜索服務器完成。然后你開始逐一點擊瀏覽搜索出的寶貝。你開始查看寶貝詳情頁面。經常網購的親們會發現,當你買過了一個寶貝之后,即便是商家多次修改了寶貝詳情頁,你仍然能夠通過‘已買到的寶貝’查看當時的快照。這是為了防止商家對在商品詳情中承諾過的東西賴賬不認。那么顯然,對於每年數十上百億比交易的商品詳情快照進行保存和快速調用不是一個簡單的事情。這其中又涉及到數套系統的共同協作,其中較為重要的是Tair,淘寶自行研發的分布式KV存儲方案。
然后無論你是否真正進行了交易,你的這些訪問行為便忠實的被系統記錄下來,用於后續的業務邏輯和數據分析。這些記錄中訪問日志記錄便是最重要的記錄之一,但是前邊我們得知,這些訪問是分布在各個地區很多不同的服務器上的,並且由於用戶眾多,這些日志記錄都非常龐大,達到TB級別非常正常。那么為了快速及時傳輸同步這些日志數據,淘寶研發了TimeTunnel,用於進行實時的數據傳輸,交給后端系統進行計算報表等操作。
你的瀏覽數據、交易數據以及其它很多很多的數據記錄均會被保留下來。使得淘寶存儲的歷史數據輕而易舉的便達到了十數甚至更多個PB(1PB=1024TB=1048576GB)。如此巨大的數據量經過淘寶系統1:120的極限壓縮存儲在淘寶的數據倉庫中。並且通過一個叫做雲梯的,由2000多台服務器組成的超大規模數據系統不斷的進行分析和挖掘。)