京東金融一面——數組和鏈表區別?爲什麼鏈表查找慢?數組查找快?爲什麼連續內存就方便查找?(查找速度快)

面試官怒懟(也是我太緊張,沒說清楚,這裏總結,其實也要說到CPU的一些東西,平時沒注意)

數組與鏈表的優缺點;

數組:
優點:使用方便 ,查詢效率 比鏈表高,內存爲一連續的區域
缺點:大小固定,不適合動態存儲,不方便動態添加
鏈表:
優點:可動態添加刪除 大小可變 ,內存可能是不連續內存,鏈式存儲。
缺點:只能通過順次指針訪問,查詢效率低

鏈表和數組的本質差異

1 在訪問方式上
數組可以隨機訪問其中的元素
鏈表則必須是順序訪問,不能隨機訪問
2 空間的使用上
鏈表可以隨意擴大
數組則不能

從CPU的角度

CPU 寄存器 – immediate access (0-1個CPU時鐘週期)
CPU L1 緩存 – fast access (3個CPU時鐘週期)
CPU L2 緩存 – slightly slower access (10個CPU時鐘週期)
內存 (RAM) – slow access (100個CPU時鐘週期)
硬盤 (file system) – very slow (10,000,000個CPU時鐘週期)

各級別的存儲器速度差異非常大,CPU寄存器速度是內存速度的100倍! 這就是爲什麼CPU產商發明了CPU緩存。 而這個CPU緩存,就是數組和鏈表的區別的關鍵所在。

CPU緩存會把一片連續的內存空間讀入,因爲數組結構是連續的內存地址,所以數組全部或者部分元素被連續存在CPU緩存裏面,平均讀取 每個元素的時間只要3個CPU時鐘時間。而鏈表的節點分散在堆空間裏面,這時候CPU緩存幫不上忙,只能是去讀取內存,平均讀取時間需要100個CPU時鐘週期。 這樣算下來,數組訪問的速度比鏈表快33倍! (這裏只是介紹概念,具體的數字因CPU而異)

總結一下, 各種存儲器的速度差異很大,在編程中絕對有必要考慮這個因素。 比如,內存速度比硬盤快1萬倍,所以程序中應該儘量避免頻繁的硬盤讀寫;CPU緩存比內存快幾十倍,在程序中儘量多加利用。

另外貼一些CPU參數,感覺原來都沒了解過,o(╥﹏╥)o

CPU性能衡量參數-主頻,MIPS,CPI,時鐘週期,機器週期,指令週期
1,主頻

主頻 = 時鐘頻率,它是指CPU內部晶振的頻率,常用單位爲MHz,它反映了CPU的基本工作節拍;

時鐘頻率又稱主頻,它是指CPU內部晶振的頻率,常用單位爲MHz,它反映了CPU的基本工作節拍;

2,時鐘週期

時鐘週期 t =1/ f; 主頻的倒數

3,機器週期

機器週期 = m*t ;一個機器週期包含若干個時鐘週期

4,指令週期

指令週期 = m*t*n; 執行一條指令所需要的時間,一般包含若干個機器週期

5,CPI

CPI = m*n; 平均每條指令的平均時鐘週期個數

指令週期 = CPI×機器週期 = n(CPI=n)×m×時鐘週期=nm/主頻f, 注意指令週期單位是s或者ns,CPI無量綱

參考:https://en.wikipedia.org/wiki/Cycles_per_instruction

6,MIPS(MillionInstructions Per Second)

MIPS = 每秒執行百萬條指令數 = 1/(CPI×時鐘週期)= 主頻/CPI

MFLOPS 每秒百萬浮點運算次數。

表示秒鐘所能執行的指令條數,對於微型計算機可用CPU的主頻和每條指令的執行所需的時鐘週期來衡量。

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章