一、逻辑结构与存储结构
1.逻辑结构
- 定义:数据元素之间的抽象关系,与计算机实现无关
- 核心视角:关注数据之间的逻辑关系(如线形、树形、图等)
- 常见类型:
- 线形结构:数组、链表、栈、队列
- 非线性结构:数、图
- 特点:仅描述数据如何组织,不涉及物理存储细节
2.存储结构
- 定义:逻辑结构在计算机内存中的具体实现方式
- 核心视角:关注数据在内存中的物理存储方式(如连续存储、链式存储)
- 常见类型:
- 顺序存储:数组(内存连续,通过索引访问)
- 链式存储:链表(通过指针链接非连续的节点
- 索引存储:b树(结合顺序与索引加速查找
- 散列存储:哈希表(通过散列函数直接定位数据)
- 特点:直接影响程序的性能(如访问速度、空间利用率)
3.区别
考虑用什么解决问题的时候,看的是逻辑结构。具体存储结构(物理实现方式)需要根据实际场景和需求设计。

二、最小堆和最大堆
逻辑结构:完全二叉树
最小堆,堆顶元素最小。当固定住堆的size=k的时候,遍历就会得到n个数种最大的元素,因为,每次和堆顶比较,比堆顶大就放进来,以维护始终是最大的元素
最大堆,堆顶元素最大。同理,维护最小k个数。
比较常见就是和堆顶比较,因为最能top,但不能查看到堆底部,也不支持随机访问。
C++中实现最大/小堆
- 用
priority_queue实现
- 是一个容器适配器
- 所在头文件
- 默认实现最大堆,即堆顶元素是最大的
std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;
模版声明
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> data = {3, 1, 4};
std::make_heap(data.begin(), data.end());
std::cout << "最大堆堆顶: " << data.front() << std::endl; // 输出: 4
// 添加元素
data.push_back(2);
std::push_heap(data.begin(), data.end());
std::cout << "添加后堆顶: " << data.front() << std::endl; // 输出: 4
// 弹出元素
std::pop_heap(data.begin(), data.end());
int top = data.back();
data.pop_back();
std::cout << "弹出元素: " << top << std::endl; // 输出: 4
std::cout << "新堆顶: " << data.front() << std::endl; // 输出: 3
return 0;
}
浙公网安备 33010602011771号