哈希表、堆、栈、队列

哈希表

哈希表就是通过一个哈希算法,将数值的关键字映射为一个存储地址,从而支持查找时直接定位。哈希表算法要解决的两个问题是:

1、寻找一个尽量均匀分布,冲突少的哈希函数;

2、出现冲突时有合理避免冲突的算法。

 

先进后出的数据结构,可用数组或链表来存储。编译器中临时变量就是保持在栈中的。

 

堆是一颗特殊的完全二叉树,

 

队列

先进先出的数据结构,可用数组或链表来存储。

 

优先队列

不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素,经常用堆来实现

### 不同数据结构的特点和使用场景 #### 数组 数组是一种线性数据结构,在一段连续的内存空间中存储多个类型相同的数据[^3]。其特点如下: - **访问速度**:通过索引可以直接快速定位到任意位置,因此查找操作的时间复杂度为 O(1)。 - **固定大小**:一旦创建后无法改变长度。 ```python arr = [1, 2, 3, 4, 5] print(arr[0]) # 输出第一个元素 ``` #### 链表 链表由一系列节点组成,每个节点包含数据部分以及指向下一个节点的指针[^4]。主要特性有: - **动态扩展**:可以根据需求增加或删除结点而不需要移动其他元素的位置; - **随机访问效率低**:由于不是连续分配的空间,所以不支持像数组那样高效地按位获取元素; ```python class Node: def __init__(self, data=None): self.data = data self.next = None node1 = Node(1) node2 = Node(2) node1.next = node2 ``` #### 哈希表 哈希表本质上是一个数组加上特定机制来处理键值映射问题[^2]。具体表现为: - **高速检索**:利用哈希函数计算得到唯一的散列码作为下标存取记录,理想情况下可达到O(1)级别的查询性能; - **解决冲突方法多样**:当两个不同的输入产生了相同的输出时称为碰撞,常用开放寻址法、拉链法等方式应对这种情况; ```python hash_table = {} key = "example" value = 42 hash_table[key] = value if key in hash_table: print(f"{key}: {hash_table[key]}") ``` #### 遵循先进后出原则(LIFO),只允许在一端进行插入和删除操作[^1]。典型应用包括表达式求值、括号匹配检测等。 ```c++ #include <stack> using namespace std; std::stack<int> s; // 创建一个整数类型的对象s s.push(1); // 向顶压入数值1 int topValue = s.top(); // 获取当前顶元素并赋给topValue变量 s.pop(); // 移除最上面的那个元素 ``` #### 通常被用来构建优先级队列,分为最大(根节点总是最大的那个)最小两种形式。内部维护着完全二叉树性质,并且满足父节点大于等于子节点的关系约束条件。 ```java import java.util.PriorityQueue; PriorityQueue<Integer> minHeap = new PriorityQueue<>(); minHeap.offer(7); minHeap.offer(9); System.out.println(minHeap.peek()); // 返回但并不移除头部元素 minHeap.poll(); // 取走头元素即最小者 ``` #### 队列 队列按照先入先出(FIFO)模式工作,两端分别定义为front 和 rear ,前者负责弹出旧成员后者则接纳新加入者。 ```cpp queue<int> q; q.push(1); // 添加至队尾 cout << q.front() << endl; // 显示队首项 q.pop(); // 出队 ``` #### 树 树形结构是由n(n>=1)个有限节点组成的具有层次关系的整体,其中有一个特殊的起始点叫做根节点,其余各层依次向下分支形成多条路径直至叶节点结束。常见的种类如二叉搜索树BST、平衡二叉树AVL Tree 等都广泛应用于文件系统目录管理等领域内。 ```javascript function TreeNode(val){ this.val=val; this.left=null; this.right=null; } let root=new TreeNode('A'); root.left=new TreeNode('B'); root.right=new TreeNode('C'); console.log(JSON.stringify(root)); ``` #### 图 图形化描述实体间关联性的抽象模型,既可以是有向边也可以无方向连接两定点之间存在权重属性的话就构成了带权图。适用于社交网络分析、地图导航规划等方面。 ```go type Graph struct { vertices map[string][]string } func (g *Graph) AddEdge(from string, to string) { g.vertices[from] = append(g.vertices[from], to) } graph := &Graph{vertices: make(map[string][]string)} graph.AddEdge("A", "B") fmt.Println(graph.vertices["A"]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值