第一次面試小記
第一次面試小記
昨天去上海蔘加了一家公司面試,面試的是爬蟲崗。下面我就記錄一下遇到的問題。問題先後順序按想到哪個寫哪個。
1.多執行緒
程序是程式執行的最小單元,每個程序都有自己獨立的記憶體空間,而執行緒是程序的一個實體,是系統呼叫的一個基本單位。
當我們啟動一個app的時候這就建立了一個程序,這個app裡可能有語音播放、搜尋等功能,這就是程序裡不同的執行緒。執行緒是輕量級的,他沒有獨立的空間地址(記憶體空間),因為他是由程序建立的,寄存在程序的記憶體地址中。一個程序會包含多個執行緒。執行緒有5中狀態(新建狀態、就緒狀態、執行狀態、阻塞狀態、死亡狀態)下面是一個簡單的多執行緒程式碼:
import threading
import time
def my_thread(threadName):
time.sleep(1)
print('執行緒:' + str(threadName)+'正在執行')
print('hello')
if __name__ == '__main__':
for i in range(4):
t = threading.Thread(target=my_thread,args=(i,))
t.start()
可以看到結果是雜亂無序的,這就是多執行緒在互相搶佔資源,造成輸出的順序不同。下面我會提供一個多執行緒爬蟲例子。
2.快速排序
參考連結:https://cuijiahua.com/blog/2017/12/algorithm_4.html
面試官隨機提的一個數據結構題目,很遺憾沒答出來,也是平時刷的不夠多。在此我貼一下程式碼。
def QuickSort(input_list, left, right): def division(input_list, left, right): base = input_list[left] while left < right: while left < right and input_list[right] >= base: right -= 1 input_list[left] = input_list[right] while left < right and input_list[left] <= base: left += 1 input_list[right] = input_list[left] input_list[left] = base return left if left < right: base_index = division(input_list,left,right) QuickSort(input_list,left,base_index-1) QuickSort(input_list,base_index+1,right) if __name__ == '__main__': input_list = [7,4,8,2,4,8,1,0] print('排序前:',input_list) QuickSort(input_list,0,len(input_list)-1) print('排序後:',input_list)
演算法流程圖如下:
上圖中,演示了快速排序的處理過程:
初始狀態為一組無序的陣列:2、4、5、1、3。
經過以上操作步驟後,完成了第一次的排序,得到新的陣列:1、2、5、4、3。
新的陣列中,以2為分割點,左邊都是比2小的數,右邊都是比2大的數。
因為2已經在陣列中找到了合適的位置,所以不用再動。
2左邊的陣列只有一個元素1,所以顯然不用再排序,位置也被確定。(注:這種情況時,left指標和right指標顯然是重合的。因此在程式碼中,我們可以通過設定判定條件left必須小於right,如果不滿足,則不用排序了)。
而對於2右邊的陣列5、4、3,設定left指向5,right指向3,開始繼續重複圖中的一、二、三、四步驟,對新的陣列進行排序。
演算法效能如下:
1、快速排序演算法的效能
2、時間複雜度
當資料有序時,以第一個關鍵字為基準分為兩個子序列,前一個子序列為空,此時執行效率最差。
而當資料隨機分佈時,以第一個關鍵字為基準分為兩個子序列,兩個子序列的元素個數接近相等,此時執行效率最好。
所以,資料越隨機分佈時,快速排序效能越好;資料越接近有序,快速排序效能越差。
3、時間複雜度
快速排序在每次分割的過程中,需要 1 個空間儲存基準值。而快速排序的大概需要 NlogN次的分割處理,所以佔用空間也是 NlogN 個。
4、演算法穩定性
在快速排序中,相等元素可能會因為分割槽而交換順序,所以它是不穩定的演算法。
3.SQL,NoSQL
本科雖然學過資料庫這門課,但是後來就沒有用過了,所以對資料庫可以說完全不瞭解。面試的時候也聞到了,在此總結一下。
SQL(Structured Query Language)資料庫,指關係型資料庫,主要代表:SQL Sever,Oracle,MySQL(開源),PostgreSQL(開源)。NoSQL(Not Only SQL)泛指非關係型資料庫。主要代表:MongoDB,Redis,CouchDB。
SQL資料存在特定結構的表中;而NoSQL則更加靈活和可擴充套件,儲存方式可以省是JSON文件、雜湊表或者其他方式。SQL通常以資料庫表形式儲存資料。舉個栗子,存個學生借書資料:
而NoSQL儲存方式比較靈活,比如使用類JSON檔案儲存上表中熊大的借閱資料:
4.Python2和3的區別
1.print 函式
print語句沒有了,取而代之的是print()函式。
2.除法運算
python2.x整數相除得整數,浮點數相除得浮點數,python3.x整數相除也會得到浮點數
3.range和xrange
range返回的是一個list物件,而xrange返回的是一個生成器物件(xrange object)。
.xrange則不會直接生成一個list,而是每次呼叫返回其中的一個值,記憶體空間使用極少,因而效能非常好
4.不等運算子
Python 2.x中不等於有兩種寫法 != 和 <>
Python 3.x中去掉了<>, 只有!=一種寫法