导航

数据结构

Posted on 2025-07-18 15:52  Zyeah  阅读(7)  评论(0)    收藏  举报

一、逻辑结构与存储结构


1.逻辑结构

  • 定义:数据元素之间的抽象关系,与计算机实现无关
  • 核心视角:关注数据之间的逻辑关系(如线形、树形、图等)
  • 常见类型:
    • 线形结构:数组、链表、栈、队列
    • 非线性结构:数、图
  • 特点:仅描述数据如何组织,不涉及物理存储细节

2.存储结构

  • 定义:逻辑结构在计算机内存中的具体实现方式
  • 核心视角:关注数据在内存中的物理存储方式(如连续存储、链式存储)
  • 常见类型:
    • 顺序存储:数组(内存连续,通过索引访问)
    • 链式存储:链表(通过指针链接非连续的节点
    • 索引存储:b树(结合顺序与索引加速查找
    • 散列存储:哈希表(通过散列函数直接定位数据)
  • 特点:直接影响程序的性能(如访问速度、空间利用率)

3.区别

考虑用什么解决问题的时候,看的是逻辑结构。具体存储结构(物理实现方式)需要根据实际场景和需求设计。
image

二、最小堆和最大堆


逻辑结构:完全二叉树
最小堆,堆顶元素最小。当固定住堆的size=k的时候,遍历就会得到n个数种最大的元素,因为,每次和堆顶比较,比堆顶大就放进来,以维护始终是最大的元素
最大堆,堆顶元素最大。同理,维护最小k个数。
比较常见就是和堆顶比较,因为最能top,但不能查看到堆底部,也不支持随机访问。

C++中实现最大/小堆

  1. 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;
2. 用算法函数`std::make_heap`+`std::vector`实现
点击查看代码
#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;
}