常见数据结构的简介(基本概念 & 操作 & 时间复杂度)


《重学数据结构与算法》学习笔记

0. 概览

数据结构特点
线性表变长
队列
数组O(1), O(n)O(1),O(n)O(1), O(n)定长
字符串
二叉树一对多
哈希表address = hash(key)

1. 线性表、栈和队列

2. 数组

数组是用来存放若干个相同类型数据元素的容器。
数组在内存中是连续存放的。数组内的数据可以通过索引值访问。

2.1 基本操作

1) 时间复杂度

  • 增/删
    • 最后位置:O(1)
    • 中间位置:O(n)
    • 基于位置:O(1)
    • 基于数值:O(n)

2) 案例

假设数组存储了5个评委对1个运动员的打分,且各分值不相同。现在请:(1) 用数组按照连续顺序保存,并去掉最大/小值。(2) 计算3个样本平均分并打印。要求不允许再开辟 O(n) 空间复杂度的结构。

3. 字符串

字符串是由字符组成的有序结构。

3.1 存储结构

  • 顺序存储

  • 链式存储

3.2 基本操作

1) 时间复杂度

以顺序存储为例。

  • 增/删
    • 最后位置,连接等:O(1)
    • 中间位置,插入等:O(n)
    • 子串查找:O(nm),其中 n 是主串长度,m 是模式串长度。

2) 案例:最大公共字符串

有字符串 a=“ATGCCATT” 和 b=“CCATGCT”,求 a 和 b 的的最大公共字符串。(提示:简单匹配 vs. 动态规划)

4. 二叉树

树:由节点和边组成的,不存在环的数据结构。
节点类型:父、子、兄弟;根、叶子。
节点位置:层次;深度。
二叉树:每个节点最多有两个子节点的树。其中除叶子节点外的节点都有两个子节点的树,称为满二叉树。除最后一层外的层节点个数都达到最大、且最后一层的叶子节点都靠左排列的树,称为完全二叉树

4.1 储存结构

  • 基于指针的链式存储
    每个节点有三个字段,分别存储数据和指向左右节点的指针。
  • 基于数组的顺序储存
    把节点存放在数组里,约定把根节点放在下标为1的位置。

4.2 基本操作

  • 遍历
    按照遍历父节点的顺序,分为前序,中序和后序遍历。
// 先序
public static void preOreder(Node node) {
   if (node == null)
       return;
   System.out.print(node.data  + " ");
   preOrder(node.left);
   preOrder(node.right);
}
// 中序
public static void inOrder(Node node){
   if (node == null)
       return;
   inOrder(node.left);
   System.out.print(node.data + " ");
   inOrder(node.right);
}
//后序
public void postOrder(Node, node){
   if (node == null)
       return;
   postOrder(node.left);
   postOrder(node.right);
   System.out.print(node.data + " ");
}

1) 时间复杂度

    • 无特性二叉树:O(n)
    • 二叉搜索树*:O(logn)
  • 增/删
    • 基于指针:O(1)

* 二叉搜索树具有以下特性:1) 任一节点的值大于其左子树中每个节点的值;2) 任一节点的值小于其右子树中每个节点的值;3) 尽可能避免两个节点数字相等的情况;4) 中序遍历可以输出一个升序的数据序列。

2) 案例:使用字典树判断字符串是否存在

字符串集合包含 cat, car, city, dog, door, deep, 判断某一字符串(如 home)是否在字符串集合中出现。

5. 哈希/散列表

哈希表:(利用函数映射将记录的存储位置关键字关联起来)根据关键字直接进行访问的数据结构。

5.1 哈希函数

  • 设计方法
    • 直接定制法:H(key) = a*key + b
    • 数字分析法:从 key 中提取若干位组成哈希地址。
    • 平方取中法:求 key 的平方值后取中间若干位数字。
    • 折叠法:将 key 分割为若干等长的部分后,取其叠加和。
    • 除留余数法:key mod p
  • 哈希冲突
    哈希冲突是指不同的 key 具有相同的 hash 值。解决哈希冲突常见的方法有:
    • 开放定址法:通过探测(如线性探测法)在哈希表形成一个序列,遇空则插。
    • 链地址法:将哈希地址相同的记录存储在一张线性链表中。

5.2 基本操作

1) 时间复杂度

  • 增/删/查:O(1)

2) 案例:构建哈希表

将关键字序列 {7, 8, 30, 11, 18, 9, 14} 存储到哈希表中。哈希函数为:H(k) = (k*3)%7,处理冲突采用线性探测法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值