【数据结构】排序与查找复习

查找与排序

查找

  1. 静态查找表
    动态查找表
  2. 内查找
    外查找
  3. 平均查找长度ASL(Average Search Length)
    平均查找长度ASL(Average Search Length)定义为
    sigma(pi*ci)=1/n*sigma(ci)
    其中,n是查找表中元素的个数,pi是查找第i个元素的概率, 一般地,除特别指出外,均认为每个元素的查找概率相等, 即pi=1/n(1≤i≤n),ci是查找到第i个元素所需的关键字 比较次数。

线性表查找

顺序查找

有一种“哨兵”。简而言之,是边界,可以要可以不要

折半查找

条件:有序
就是二分捏

//拆半查找非递归算法 
int BinSearch1(vector<int>& R,int k) {
    
    
    int n=R.size();
    int low=0,high=n-1;
    while (low<=high){
    
      //要的等于
        int mid=(low+high)/2;
        if (k==R[mid])
            return mid;//书上这种是在这里返回答案
        if (k<R[mid])
            high=mid-1;
        else
            low=mid+1;
    }
}
return -1;
//自己更喜欢这种写法
int tofind(int x,int l,int r) {
    
    
    int mid;
    while(l<r) {
    
    //反正这里和下面的要对应
        mid=(l+r)/2;
        if(cc[mid]>=x) r=mid;//这个下面的r对应
        else l=mid+1;
    }
    //cout<<cnt[r]<<'\n';
    if(cc[r]==x)
        return cnt[r];
    else return 0;
}
分块查找

像不像 ?-associative cache?
block number就是index

树表查找——动态查找表

BST

左小右大
中序遍历有序

  1. 删除节点:找到左子树最右边的那个代替
  2. 添加节点:一步步往下走就好
平衡二叉树

AVL树的高度平衡性质:树中每个结点的左、右子树的高度至多相差1。

  1. LL
  2. LR
  3. RR
  4. RL
红黑树——弱平衡树

1 每个结点的颜色为红色或者黑色。
2 根结点的颜色为黑色。
3 所有外部结点的颜色为黑色。
4 如果一个结点是红色,则它的所有孩子结点为黑色。
5 对于每个结点,从该结点出发的所有路径上包含相同个数的黑色结点。
路径特指从一个结点到其子孙结点中某个外部结点的路径。

B+/B树

哈希表查找

设要存储的元素个数为n,设置一个长度为m(m≥n)的连 续内存单元。
以每个元素的关键字ki(0≤i≤n-1)为自变量,通过一个哈希函数h把ki映射为内存单元的地址(或相对地址)h(ki)。
并把该元素存储在这个内存单元中

冲突

对于两个不同的关键字ki和kj(i≠j)出现h(ki)=h(kj),这种现象称为哈希冲突。
将具有不同关键字而具有相同哈希地址的元素称为“同义词”,这种冲突也称为同义词冲突。(这是一个东西)

关系

扫描二维码关注公众号,回复: 17105971 查看本文章
  1. 与装填因子有关。所谓装填因子α是指哈希表中已存入的元素数n与哈希地址空间大小m的比值,即α=n/m。α越小,冲突的可能性就越小; 但α越小,存储空间的利用率就越低。
  2. 与所采用的哈希函数有关。
  3. 与解决冲突的方法有关。
    解决:
  1. 开放定址法:
    (1)线性探测法:依次+1往后直到找到空位
    (2)平方探测法:d0=h(k), di=(d0±i^2) mod m (有点像爬树法?)
  2. 拉链法(有点像邻接表)
    拉链法是把所有的同义词用单链表链接起来的方法。
    在这种方法中,哈希表每个单元中存放的不再是元素本身, 而是相应同义词单链表的首结点指针。
    由于单链表中可插入任意多个结点,所以此时装填因子α根 据同义词的多少既可以设定为大于1,也可以设定为小于或 等于1,通常取α=0.75。

unordered_map

hash函数构造方法
  1. 直接定址法:h=k+C
  2. 除留余数法:h(k)=k mod p(p质数——冲突尽量小)

排序

  1. 内排序 外排序
  2. 不基于比较的排序:基数排序
  3. 如果待排序的表中,存在有多个关键字相同的元素,经过排 序后这些具有相同关键字的元素之间的相对次序保持不变, 则称这种排序方法是稳定的。
    反之,若具有相同关键字的元素之间的相对次序发生变化,则称这种排序方法是不稳定的。

插入排序

从无序区插入到有序区域

直接插入排序

稳定

折半插入

稳定
排序没有优化:因为往后移耗费时间

希尔排序

分成n个组
遥远相隔的两个换来换去!
但是是插入排序
组数越来越少
O(n^1.58)
不稳定

交换排序

冒泡排序

swap
从左到右比较,交换,从左到右比较,交换
相邻的交换

快速排序

三叉树
选择基准,l\r分别向中间移动,若某一个没有被换位置,那么当前的指针再移动一次(好像打牌)
快速排序算法

选择排序

简单选择排序
从一个无序区中选出最小的元素,最简单方法是逐个进行元素比较,例如,从无序区R[i…n-1]中选出最小元素R[minj]。

堆排序

不稳定
空间O(1)
时间O(nlogn)

归并排序

常年写的
非常稳定

基数排序

最低位优先(LSD)/最高位优先(MSD)
大概是最重要的哪一位最后来

对比选择

代码 爱看不看不看拉倒,只会写归并排序。

可视化——好东西捏

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39440588/article/details/129150838