數據結構/算法 | 語言內置 | 內置庫 |
---|---|---|
線性結構 | list(列表)/tuple(元祖) | array(數組,不經常使用)/collection.namedtuple |
鏈式結構 | collections.deque(雙端隊列) | |
字典結構 | dict(字典) | collections.Counter(計數器)/OrderedDict(有序字典) |
集合結構 | set(集合)/frozenset(不可變集合) | |
排序算法 | sorted | |
二分算法 | bisect模塊 | |
堆算法 | heapq模塊 | |
緩存算法 | functors.lru_cache(Least Recent Used,python3) |
coolections模塊提供了一些內置數據結構的擴展node
collections Point = collections.namedtuple('Point','x','y') p = Point(1,2)
namedtuple讓tuple屬性可讀python
de = collections.deque() de.append(1) de.appendleft(0)
c = collections.Counter() c = coolections.Counter('abcab')
python dict 底層結構web
t = ([1],2,3) t[0].append(1) t ([1,1],2,3) 保存的引用不可變指的是你無法替換掉這個對象,可是若是對系那個自己是一個可變對象,是能夠修改這個引用指向的可變對象的
Least-Recently-Used 替換掉最近最少使用的對象算法
字典用來緩存,循環雙端鏈表用來記錄訪問順序後端
from collections import OrderedDict class LRUCache: def __init__(self, capacity=128): self.od = OrderedDict() self.capacity = capacity def get(self, key): #每次訪問更新最新使用的key if key in self.od: val = self.od[key] self.od.move_to_end(key) return val else: return -1 def put(self, key, value): # 更新k/v if key in self.od: del self.od[key] self.od[key] = value # 更新key 到表頭 else: # insert self.od[key] = value # 判斷當前容量是否已經滿了 if len(self.od) > self.capacity: self.od.popitem(last=False) code/lrucache.py
排序+查找,重中之重數組
python web 後端常考數據結構緩存
常考數據結構之鏈表數據結構
鏈表有單鏈表、雙鏈表、循環雙鏈表app
數據結構之鏈表數據結構和算法
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: pre = None cur = head while cur: nextnode = cur.next cur.next = pre pre = cur cur = nextnode ruture pre
隊列(queue)是先進先出結構
from collections import deque class Queue: def __init__(self): self.items = deque() def append(self, val): retuen self.items.append(val) def pop(self): return self.items.popleft() def empty(self): return len(self.items) == 0 def test_queue(): q = Queue() q.append(0) q.append(1) q.append(2) print(q.pop()) print(q.pop()) print(q.pop()) test_queue()() 0 1 2
棧(stack)是後進先出結構
from collections import deque class Stack(object): def __init__(self): self.deque = deque() # 或者用list def push(self, value): self.deque.append(value) def pop(self): return self.deque.pop()
一個常考問題: 如何用兩個棧實現隊列?
python dict/set 底層都是哈希表