列表 又称 顺序表
32 位 机器上 , 一个整形占4 个 字节 一个地址 占 4 个 字节
数组与列表的两点不同:
1. 数组元素类型相同
2. 数组的长度固定
python 中的列表其实存储的是元素的内存地址,因此列表中可以存储不同的数据元素 python 列表中删除和插入的时间复杂度 都是 O(n) ;
链表是一系列节点组成的元素集合。每个节点包含两部分。数据域item和指向下一个节点的指针next。 通过节点之间的相互连接,最终串成链表
class Node: def __init__(self, item): self.item = item self.next = None a = Node(1) b = Node(2) c = Node(3) # 通过next 把各个节点连接起来 a.next = b b.next = c print(a.next.next.item)
头插法
class Node: def __init__(self, item): self.item = item self.next = None ## 通过列表进行插入 def create_linklist_head(li): head = Node(li[0]) for element in li[1:]: node = Node(element) node.next = head head = node return head def print_linklist(lk): while lk: print(lk.item, end=',') lk = lk.next lk = create_linklist([1,2,3]) print(lk.item)
尾插法
class Node: def __init__(self, item): self.item = item self.next = None class create_linklist_tail(li): head = Node(li[0]) tail = head for element in li[1:]: node = Node(element) tail.next = node tail = node return head
链表的插入
链表的删除
双链表的每个节点有两个指针: 一个指向后一个节点, 另一个指向前一个节点
class Node: def __init__(self,item =Node): self.item = item self.next = None self.prior = None
总结
哈希表一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作: 保证 Insert get del 是高效的。 直接寻址表 当关键字的全域U 比 较小时,直接寻址是一种简单而有效的方法 。 哈希表 是由一个直接寻址表和一个哈希函数组成。 哈希函数h(k) 将元素关键字k 作为自变量,返回元素的存储下标。
开放寻址法: 如果哈希函数返回的位置已经有值,则可以向后探查新的位置来存储这个值。
线性探查:如果位置i 被 占用 ,则探查i + 1 , i + 2
二次探查: 如果位置i 被占用 ,则探查i + 2 , i - 1
二度哈希: 有n 个 哈希函数,当使用第一个哈希函数h1 发生冲突,则尝试使用h2, h3
拉链法: 哈希表每个位置都连接一个链表 ,当冲突发生时,冲突的元素将被加到该位置链表的最后。
class LinkList: class Node: def __init__(self, item=None): self.item = item self.next = None class LinkListIterator: def __init__(self, node): self.node = node def __next__(self): if self.node: cur_node = self.node self.node = cur_node.next return cur_node.item else: raise StopIteration def __iter__(self): return self def __init__(self, iterable=None): self.head = None self.tail = None if iterable: self.extend(iterable) def append(self, obj): s = LinkList.Node(obj) if not self.head: self.head = s self.tail = s else: self.tail.next = s self.tail = s def extend(self, iterable): for obj in iterable: self.append(obj) def find(self, obj): for n in self: if n == obj: return True else: return False def __iter__(self): return self.LinkListIterator(self.head) def __repr__(self): return "<<" + ",".join(map(str, self)) + ">>" # 类似于集合的结构 哈希表 class HashTable: def __init__(self, size=101): self.size = size self.T = [LinkList() for i in range(self.size)] def h(self, k): return k % self.size def insert(self, k): i = self.h(k) if self.find(k): print("Duplicated Insert") else: self.T[i].append(k) def find(self, k): i = self.h(k) return self.T[i].find(k)