(1.4.2)数据结构类

1 以下哪种结构,平均来讲获取任意一个指定值最快?

A、二叉排序树B、哈希表C、栈D、队列

B、哈希表 维护成本越高,查询越快

数组类

基本定义

  1. 数组存储矩阵,用于矩阵乘法
    则两个都按照行优先比较好,可以使用Strassen矩阵相乘发,时间复杂度降低为O(n2.81),用分治的思想将矩阵分块计算

  2. 二维数组并不是 数组元素为线性表的线性表。
    二维数组是顺序存储的线性表,其元素都是线性表的元素

  3. 二维数组可以不指定1维,但不可以不指定2维的长度

  4. 线性表是具有n个(数据元素)的有限序列(n>0)

  5. 每种数据结构都应具备三种基本运算:插入、删除。
    没有搜索,譬如栈、队列

  6. 二维数组是默认的存储模式是行优先存储,也就是每行的数据都是连续的,而每列的数据是不连续的,所以按行访问更快。

  7. 三对角矩阵,第一行是2个元素,下面都是3个
    将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1..298]中,A中元素A6665(即该元素下标i=66,j=65),在B数组中的位置K为(195)=(2+(66-1-1)*3)+1;
    66行第65个其实是第66行第一个元素
    这里写图片描述

矩阵压缩

  1. 稀疏矩阵的压缩存储:三元组和十字链表法

  2. 稀疏矩阵压缩存储后,必会失去随机存取功能

  3. 三元组:三元组表示法要求按行有序存储。所以,交换下标后,还要重新排序。
    三元组转置: (1)将数组的行列值相互交换 (2)将每个三元组的i和j相互交换 (3)重排三元组的之间的次序便可实现矩阵的转置

  4. 三元组除了存储元组信息外,还要占有3个int: 行数,列数,元素个数

循环与查找

  1. 循环嵌套的时候,内层循环要比外层循环块;
    所以要尽量减小外层循环执行的次数—->外层循环数越小,效率越高

  2. 在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行(9)次比较
    比如 A B C D E F G H,通过8进4的方式,A与B比较, C与D比较…..然后再4进2,A与C比较(假设A,C比B,D大),E与G比较。再2进1,比如A与E比较(假设A,E比C,G大)选出最大的A,总共7次。
    然后次大的数一定是被最大数PK下去的,所以再选B C E三个比较2次得到次大的数
    这里写图片描述
    再选 BCE中最大的(2次),共9次,不过可以这个方法比较次数是少一点,但是所需要的空间大,要记下与沿途的最大值比较的数。

  3. 周期性数组
    一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,这个序列的初始值从1开始,但是1并不在这个数列中。求第1500个值是多少?
    2、3、5的最小公倍数是30。[ 1, 30]内符合条件的数有22个。如果能看出[ 31, 60]内也有22个符合条件的数,那问题就容易解决了。也就是说,这些数具有周期性,且周期为30.
    第1500个数是:1500/22=68 1500%68=4。也就是说:第1500个数相当于经过了68个周期,然后再取下一个周期内的第4个数。一个周期内的前4个数:2,3,4,5。
    故,结果为68*30=2040+5=2045

  4. 一个5*4的矩阵,有多少个长方形=150
    长任取两个点C(6,2)宽任取两个点C(5,2) = 15 10 = 150

字符串 和 广义表

定义类

  1. 空串是任意字符串的子串;本身也是本身的子串;子串个数=n*(n+1)/2

  2. 空串与空格串

  3. 串既可以采用顺序存储,也可以采用链式存储

  4. 转义字符
    注意 \ \ 表示字符 \
    \123表示字符 {
    \t 表示制表符
    这些都是一个字符,占1个字节

  5. 对长度为无穷大的广义表,由于存储空间的限制,不能在计算机中实现

基本函数

  1. strcat(*p1,*p2) 将p2指向的字符串拼接到p1指向字符串位置的后边,注意p1的位置要足够,否则报错
    char *p1 = ”123”, *p2 = ”ABC”
    strcat(p1, p2) 报错,因为p1没位置了

模式匹配

  1. KMP中修正后的 Nextval[i]
    从 nextval[1] 开始,如果某位(字符)与它 next 值指向的位(字符)相同,则该位的 nextval 值就是指向位的 nextval 值(nextval[i] = nextval[ next[i] ]);如果不同,则该位的 nextval 值就是它自己的 next 值(nextvalue[i] = next[i])。

  2. KMP算法的特点是在模式匹配时指示主串的指针不会变小
    -(1.2.3)串的结构定义和模式匹配

java的String、StringBuffer、StringBuilder

  1. String、StringBuffer的Object
    String重写了Object的equals(),所以只需要看内容是否相等即可,但是StringBuffer没有重写equals(),此处的equals()仍然是调用的Object类的,所以,调用StringBuffer类的equals(),只有地址和内容都相等的字符串,结果才会返回true。

  2. String、StringBuffer效率比较
    效率比较String < StringBuffer < StringBuilder,但是在 String S1 = “This is only a” + “ simple” + “ test”时,String效率最高。

  3. String、StringBuffer存储空间
    String类在追加的时候,源字符串不变(这就是为什么说String是不可变的字符串类型),和新串连接后,重新开辟一个内存。这样就会造成每次连接一个新串后,都会让之前的串报废,因此也造成了不可避免的内存泄露
    StringBuffer则不会,自动追加

  4. StringBuffer的capacity()
    capacity()获取的是当前缓冲区的大小

链表

定义

  1. 单链表中,增加一个头结点的目的是为了方便运算的实现
  2. 用单链表表示的链式队列的队头在链表的链头位置

栈和队列

定义

  1. 栈具有记忆功能,队列没有
    记忆功能是指记录最后一个存入操作的数
    栈的特点是先进栈的后出栈,后进栈的先出栈,所以你对一个栈进行出栈操作,出来的元素肯定是你最后存入栈中的元素,所以栈有记忆功能 。
    而队列是先进先出,你取队列的第一个元素,得到的是你最先存入队列的元素,而不是上一个存入队列的元素,所以没有记忆功能

  2. 循环队列是队列的顺序存储结构

树和二叉树

定义

红黑树、B+、B-树

  1. 红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)

  2. B+树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)

  3. 平衡二叉树的各项操作的时间复杂度为O(logn)

定义

  1. 堆不一定是一棵平衡二叉树。 堆的形状是一颗完全二叉树
    虽然我们经常看到的堆总是一刻平衡二叉树,但是堆的定义里并没有强制要求【左右子树差值<=1】,即使高度相差较大仍为堆

  2. 堆不一定是完全二叉树 但是一般采用完全二叉树

  3. 堆一定是树,但不一定是二叉树

哈希表HASH

定义

  1. hash函数可以把字符串等任意长度的输入映射成固定长度的整数,也就是哈希值

  2. 根据特定的哈希值,它可以找到对应的原信息值

  3. 不同的信息很难产生一样的哈希值

  4. 哈希表是一种存储结构,散列式存储

  5. Hash表插入操作的平均时间复杂度为O(n),最坏时间复杂度为O(n2)
    哈希表插入的时间复杂度与冲突次数有关,O(冲突次数/n),最好的情况冲突次数为0,直接插入,时间复杂度为O(1)。最坏情况是所有值对应同一个键值,这是冲突次数最多,为0+1+2+3+4+…+(n-1)=n*(n-1)/2,平均比较次数为(n-1)/2,时间复杂度为O(n)

  6. 采用哈希表组织100万条记录,以支持字段A快速查找,则拉链式哈希曼最坏查找时间复杂度是O(n),最坏情况是所有记录的散列值都冲突,这样就退化为线性查找,时间复杂度为O(n)

  7. 随着装填因子a的增大,用闭哈希法解决冲突,其平均搜索长度比用开哈希法解决冲突时的平均搜索长度增长得慢 (X) 不对,因为这个是不一定的,装填因子由小变大时,这个中间有个临界值

  8. 基于哈希的索引和基于树的索引有什么区别

    1. hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
    2. hash索引无法被用来进行数据的排序操作
    3. 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用
    4. Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高

构造、散列函数、哈希函数

  1. 散列函数

    1. 直接定址法
    2. 数字分析法
    3. 乘余取整法
    4. 平方取中法
    5. 除留余数法
    6. 随机数法
    7. 单选转法
  2. 装填因子
    散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度
    它反映哈希表的装满程度()  
    α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小

  3. 哈希法的平均查找长度不随表中结点数目的增加而增加,而是随负载因子的增大而增大()

  4. 哈希函数的选择跟数据元素关系密切,跟数据元素的字段类型有关,哈希函数设计的好坏也影响着查找的速度

  5. 把整数关键字K Hash到有N个槽的散列表,h(k)=k mod N,最合适

冲突

  1. 冲突解决方法
    1. 开放定址法
      冲突发生时,使用某种探查技术在散列表中形成一个探查序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址。
      1. 线性探查法(Linear Probing)
      2. 线性补偿探测法
      3. 随机探测
      4. 二次探查法
    2. 拉链法
      1. 拉链法处理冲突简单,且无堆积现象
        即非同义词决不会发生冲突,因此平均查找长度较短;
      2. 由于结点空间是动态申请的,更适合于造表前无法确定表长的情况
      3. 拉链法适合较多元素,能够充分利用存储空间
        开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
      4. 在用拉链法构造的散列表中,删除结点的操作易于实现
        只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。.这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

定义

  1. AOV网的含义是以顶点表示活动的网 activity on v

  2. 图的BFS生成树的树高比DFS生成树的树高 小或相等

  3. 方法可以判断出一个有向图是否有环 深度优先遍历和拓扑排序

  4. 一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次。

  5. 连通图上各边权值均不相同,则该图的最小生成树是唯一的

最短路径

  1. Floyed求每对不同顶点对的算法中允许弧上的权为负,但不能有权和为负的回路。

  2. 求从指定源点到其余各顶点的迪杰斯特拉(Dijkstra)最短路径算法中弧上权不能为负的原因是在实际应用中无意义;

  3. 在用Floyd算法求解各顶点间的最短路径时,每个表示两点间路径的path(k-1)[I,J]一定是path(k)[I,J]的子集(k=1,2,3,…,n)()

关键路径

  1. AOE网(Activity On Edge)即边表示活动的网,是一个带权的有向无环图,其中顶点表示事件(Event),每个事件表示在它之前的活动已经完成,在它之后的活动可以开始,弧表示活动,权表示活动持续的时间。

  2. AoE网 ,延期某个关键活动,整个工程的时间必定延期

    1. 任何一个关键活动提前完成,那么整个工程将会提前完成 错误
  3. 在AOE图中,关键路径上活动的时间延长多少,整个工程的时间也就随之延长多少

  4. 关键路径是AOE网中从源点到终点的最长路径()

欧拉回路:从一点出发,可以遍历图上的每条边一次,而且仅遍历一次

  1. 无向图: 图连通,所有点都是偶数度,或者只有两个点是奇数度。当所有点是偶数度时欧拉路起点可以是任意点;当有两个奇数度点时起点必须是奇数度点。

  2. 有向图: 图连通,所有点出度=入度,或者有一个点入度-出度=1,有一个点出度-入度=1。同样,当所有点出度=入度时任意点可作为起点;而后者必须以出度-入度=1的点做起点,入度-出度=1的点做终点。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值