1. 程式人生 > >資料探勘面試常見的問題

資料探勘面試常見的問題

一、程序與執行緒的區別,執行緒的缺點

程序和執行緒都是由作業系統程式執行的基本單元,系統利用該基本單元實現系統對應用的併發性。

區別在於: 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒。 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。 

另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。 

執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

執行緒的缺點:

每個執行緒與主程式共用地址空間,地址空間受限; 執行緒之間的同步和加鎖控制

比較麻煩; 一個執行緒的崩潰可能影響到整個程式的穩定性; 

執行緒能夠提高的總效能有限,而且執行緒多了之後,執行緒本身的排程也是一個麻煩事兒,需要消耗較多的CPU 。

二、堆和棧的區別

一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分  

  1、棧區(stack)——由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。  

  2、堆區(heap)——般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。  

  3、全域性區(靜態區)(static)——全域性變數和靜態變數的儲存是放在一塊的,初始化的 全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相

  鄰的另 一塊區域。程式結束後由系統釋放。  

  4、文字常量區  ——常量字串就是放在這裡的。   程式結束後由系統釋放  。

  5、程式程式碼區 ——存放函式體的二進位制程式碼。  

理論知識    

  1、申請方式    

  stack:   由系統自動分配。例如,宣告在函式中一個區域性變數int  b; 系統自動在棧中為b開闢空間。

  heap:   需要程式設計師自己申請,並指明大小,在c中malloc函式,c++中new函式。

   2、申請後系統的響應    

  棧:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。    

  堆:從系統有一個記錄空閒記憶體地址的連結串列中查詢合適的塊進行分配。

  3、申請大小的限制    
  棧:在Windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小   是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。    

  堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的   大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。    

  4、申請效率的比較:    

  棧由系統自動分配,速度較快。但程式設計師是無法控制的。    

  堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。    

  5、堆和棧中的儲存內容     

  棧:在函式呼叫時,第一個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的地址,然後是函式的各個引數,在大多數的C編譯器中,引數是由右往     左入棧 的,然後是函式中的區域性變數。注意靜態變數是不入棧的。當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的地址,也就是主函式   中的下一條指令,程式由該點繼續執行。    

  堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容由程式設計師安排。    

  6、存取效率的比較    

  棧是在編譯時就確定的;堆是在執行時刻賦值的;在棧上的陣列比指標所指向的字串(例如堆)快。

  三、new 和 malloc 的區別

  new 返回指定型別的指標,並且可以自動計算所需要大小。

int *p;   
p = new int; //返回型別為int* 型別(整數型指標),分配大小為 sizeof(int);
   或
int* p;   
p = new int [100]; //返回型別為 int* 型別(整數型指標),分配大小為 sizeof(int) * 100;
   而 malloc 則必須要由我們計算位元組數,並且在返回後強行轉換為實際型別的指標。 
int* p;   
p = (int *) malloc (sizeof(int)*128);//分配128個(可根據實際需要替換該數值)整型儲存單元,並將這128個連續的整型儲存單元的首地址儲存到指標變數p中  

double *pd=(double *) malloc (sizeof(double)*12);//分配12個double型儲存單元,並將首地址儲存到指標變數pd中
   PS:有了malloc/free為什麼還要new/delete?

   malloc與free是C++/C語言的標準庫函式,new/delete是C++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

   由於malloc/free是庫函式而不是運算子,無法滿足動態物件的要求。因此C++語言需要一個能完成動態記憶體分配和初始化工作的運算子new,以及一個能完成清理與釋放記憶體    工作的運算子delete。注意new/delete不是庫函式。 

   new/delete的功能完全覆蓋了malloc/free,由於C++程式經常要呼叫C函式,所以new/delete必須配對使用,malloc/free也一樣。

   四、hash衝突是指什麼?怎麼解決?給兩種方法,寫出過程和優缺點。

   1.線性再雜湊法(開放定址法) 
   原理:線性再雜湊法是形式最簡單的處理衝突的方法。插入元素時,如果發生衝突,演算法會簡單的遍歷hash表,直到找到表中的下一個空槽,並將該元素放入該槽中。查詢元    素時,首先雜湊值所指向的槽,如果沒有找到匹配,則繼續遍歷hash表,直到:(1)找到相應的元素;(2)找到一個空槽(指示查詢的元素不存在);(3)整個hash表      遍歷完畢(指示該元素不存在並且hash表是滿的) 
   優點:簡單直觀 
   缺點:第一,不能從表中刪除元素,因為相應的單元可能已經引起過沖突,元素繞過它存到了別處,如果我們刪除了某個元素,那麼其他的元素都會找不到。第二,當表被      填滿時效能下降明顯。 
   2.再雜湊法 
   原理:構造雜湊函式集{H1,H2,...,Hn},當發生衝突時,依次使用雜湊函式,直至不存在衝突為止。 
   優點:避免了資料聚集現象 
   缺點:計算時間較多,同時也不能刪除元素 
   3.拉鍊法 
   原理:拉鍊法解決衝突的做法是:將所有關鍵字為同義詞的結點連結在同一個單鏈表中。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指標組成的指標陣列        T[0..m−1]。凡是雜湊地址為i的結點,均插入到以T[i]為頭指標的單鏈表中。T中各分量的初值均應為空指標。 
   優點:拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;由於拉鍊法中各連結串列上的結點空間是動態申請的,故它更適合於造表前      無法確定表長的情況;在用拉鍊法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去連結串列上相應的結點即可。 
   缺點:它需要稍微多一些的空間來實現,因為新增任何元素都需要新增指向節點的指標,並且每次探查也要花費稍微多一點的時間,因為它需要間接引用指標,而不是直接      訪問元素。

  五、 其他

  1、8進位制語法的意思是用0-7代表共8種許可權。檔案和目錄的訪問許可權位一共有9位,每3位分別代表屬主,所屬使用者組,其他使用者對它的許可權。

   r對應“讀”-數字4,w對應“寫”-數字2,x對應“執行”-數字1,-對應數字0 

   例子:-rwxr-xr-x用8進製法表示就是755,rwx=4+2+1=7,r-x=4+0+1=5

   2.資料庫建立索引的原則

   在經常需要搜尋的列上,可以加快搜索的速度;在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;在經常用在連線的列上,這些列主要是一些外來鍵,可以加

   快連線的速度;在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢

   可以利用索引的排序,加快排序查詢 時間;在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。

   3、資料庫事務的定義與特點

   事務(Transaction)是併發控制的單位,是使用者定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。通過事務,SQL Server能將邏輯相關      的一組操作繫結在一起,以便伺服器保持資料的完整性。
   事務的特性(ACID特性)

  •    原子性(Atomicity),事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。
  •    一致性(Consistency),事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
  •    隔離性(Isolation), 一個事務的執行不能被其他事務干擾。
  •    持續性/永久性(Durability),一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。
   4、簡述資料庫操作的步驟
   建立資料庫連線——開啟資料庫連線——建立資料來源庫命令——執行資料庫命令——儲存資料庫命令——關閉資料庫命令    5、TCP/IP的四層結構    TCP/IP參考模型分為四個層次:應用層、傳輸層、網路互連層和主機到網路層。
   1)主機到網路層(介面層)
   物理層提供給其上層-網路互連層一個訪問介面,以便在其上傳遞IP分組。實現方法將隨著網路型別的不同而不同。      2)網路互連層(網路層)
  負責相鄰計算機之間的通訊。其功能包括三方面:一、處理來自傳輸層的分組傳送請求,收到請求後,將分組裝入IP資料報,填充報頭,選擇去往信宿機的路徑,然後將資料報發往適當的網路介面。二、處理輸入資料報:首先檢查其合法性,然後進行尋徑--假如該資料報已到達信宿機,則去掉報頭,將剩下部分交給適當的傳輸協議;假如該資料報尚未到達信宿,則轉發該資料報。三、處理路徑、流控、擁塞等問題。
   3)傳輸層  
 提供應用程式間的通訊。 其功能包括:一、格式化資訊流;二、提供可靠傳輸。為實現後者,傳輸層協議規定接收端必須發回確認,並且假如分組丟失,必須重新發送。
  傳輸層協議主要是:傳輸控制協議TCP(Transmission Control Protocol)[三次握手]和使用者資料報協議UDP(User Datagram protocol)[發出之後不管是否收到]。    4)應用層  
  向用戶提供一組常用的應用程式,比如電子郵件、檔案傳輸訪問、遠端登入等。 
  應用層面向不同的網路應用引入了不同的應用層協議。其中,有基於TCP協議的,如檔案傳輸協議(File Transfer Protocol,FTP)、虛擬終端協議(TELNET)、超文字連結協議(Hyper Text Transfer Protocol,HTTP),也有基於UDP協議的。
   6、MVC( 模型-檢視-控制器)結構,簡要介紹各層結構的作用
  •         Model(模型)是應用程式中用於處理應用程式資料邏輯的部分。通常模型物件負責在資料庫中存取資料。
  •         View(檢視)是應用程式中處理資料顯示的部分。通常檢視是依據模型資料建立的。
  •         Controller(控制器)是應用程式中處理使用者互動的部分。通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。
   7、4種序列模式挖掘演算法         Apriori類演算法在稀疏資料集的應用中比較合適,不適合稠密資料集的應用。對於有約束條件(例如相鄰事務的時間間隔約束)序列模式挖掘,GSP更適用。     FreeSpan和PrefixSpan在兩種資料集中都適用,而且在稠密資料集中它們的優勢更加明顯。更快更有效,實現難度大。兩者相比,PrefixSpan的效能更好一些。     現在大多數應用都是採用Apriori類演算法的改進演算法。