問題列表
python裏的list和tuple有什麼區別?
- tuple(元組)是不可變列表,
- list的可變性是由於其底層實現機制導致的, 動態數組 + 鏈表
python裏的string釋放可以使用for循環修改?
不可以, 它是不可變序列
python裏的dictionary和C++的map有什麼區別? 其底層實現原理是什麼?
- python裏的字典通過哈希表實現的
- C++ 的map的實現時通過紅黑樹實現的
- dict操作複雜度如下:
操作 時間複雜度 copy O(n) get(value) O(1) delete(value) O(1) search(in) O(1) itteratioon O(n)
python的set實現原理
- set與dict類似,但hash函數直接操作它的元素, 而且不包含重複元素
- 實現方式成爲Hash set
python的OrderedDict的實現原理
- python中的字典是按照hash來存儲的, 因此是無序的
- OrderedDict的實現是 哈希表 + 雙向鏈表
什麼是雙向隊列
它是一種具有隊列和棧的性質的數據結構,可以高效的在頭尾兩端插入和刪除元素
什麼是優先隊列
- 優先隊列中,元素被賦予優先級。當訪問元素時,具有最高優先級的元素最先刪除。優先隊列具有最高級先出(first in, largest out)的行爲特徵。
- Python裏PriorityQueue是通過heapq實現的,它考慮了線程安全的問題
最大堆、最小堆
- 堆
- 它是一棵完全二叉樹或者爲空
- 樹中節點的值總是不大於或者不小於其孩子節點的值
- 每一個節點的子樹也是一個堆
- 最大堆: 除了根節點外的的所有節點都要滿足小於等於其父節點的值
- 最小堆: 除了根節點以外的所有節點都要滿足大於等於其父節點的值
- Python裏是通過list維護堆的性質實現的
python中的深、淺copy
- 淺copy, copy第一層內容,不copy內部對象,下面這個例子可以很好的理解淺copy.
輸出結果:lst = ["CV", "NLP", "SPEECH", ["DL, ML, AI"]] lst_copy = lst.copy() print(id(lst), id(lst_copy)) print(id(lst[3]), id(lst_copy[3])) lst.append("Algorithm") print(lst, lst_copy) lst[3].append("Statitics") print(lst, lst_copy)
4584596232 4584596360 4584596104 4584596104 ['CV', 'NLP', 'SPEECH', ['DL, ML, AI'], 'Algorithm'] ['CV', 'NLP', 'SPEECH', ['DL, ML, AI']] ['CV', 'NLP', 'SPEECH', ['DL, ML, AI', 'Statitics'], 'Algorithm'] ['CV', 'NLP', 'SPEECH', ['DL, ML, AI', 'Statitics']]
- 深copy, copy所有內容,生成一個新的完完全全的對象
list可以作爲哈希關鍵字嗎
- 一個對象能不能作爲字典的key,取決於其有沒有__hash__方法, 參考(https://blog.csdn.net/lnotime/article/details/81192207)
- list, dict, set不能作爲key
- 數值,字符串,完全不可變的元組,函數,類,方法等可以作爲key
C++的多態是什麼,如何實現的?
- 多態按字面的意思是多種形態,當類之間存在層次結構並且類之間是通過繼承關聯時,就會用到多態
- C++多態意味着調用成員函數時,會根據調用函數的對象的類型來執行不同的函數
- 虛函數實現, 在基類中使用關鍵字virture聲明的函數
- 參考鏈接 C++ 多態
補充知識
-
哈希表
- 關鍵字 基於關鍵字直接找到數據的存儲位置
- 哈希地址 在查找表中的存儲位置
- 哈希函數 通過這個函數可以快速求出該關鍵字對應數據的哈希地址
- 直接定址法(一次函數)
- 數字分析法
- 平方取中法
- 摺疊法
- 除留餘數法
- 隨機數法
- 解決衝突的方法
- 開放定址法
- 線性探測
- 二次探測
- 僞隨機數探測法
- 再哈希法
- 鏈地址法
- 建立一個公共溢出區
- 開放定址法