首页 > 编程语言 >数据结构·查找算法

数据结构·查找算法

时间:2024-03-02 22:13:48浏览次数:22  
标签:10 frac -- mid 算法 查找 数据结构 ASL

查找

1.顺序查找

一般表

(1)代码

typedef struct{
    ElemType *elem;
    int tableLen;
}SSTable;

int searchSeq(SSTable ST, ElemType key){
    ST.elem[e] = key;   //设置哨兵
    for(int i = 0; i<ST.tableLen; i++)
        return i;   //存在返回, 不存在返回1
}

(2)设置哨兵:可以不必判断是否越界,注意数据下表从1开始
(3)ASL

\[如果不能知道查找概率,可先对记录的查找概率进行排序,是表中的记录按查找概率从小到大\\ ASL_{success} = \sum_{i=1}^{n} P_i(n-i+1) = \frac{n+1}{2}\\ ASL_{unsuccess} = n+1\\ \]

(4)优缺点
优点:对数据的存储无要求,顺序存储或者链式存储皆可
缺点:当n较大,平均查找长度较大,效率低

有序表

graph LR id1((10))--id2((20)) id1((10)).--infinity,10 id2((20))--id3((30)) id2((20)).--infinity,20 id3((30))--id4((40)) id3((30)).--infinity,30 id4((40))--id5((50)) id4((40)).--infinity,40 id5((50))--id6((60)) id5((50)).--infinity,50 id6((60))--60,= id6((60)).--infinity,60

(1)一旦查到某个元素大于该元素便停止查找
(2)方框是虚构的节点,查找长度=方框上的圆环
(3)ASL

\[ASL_{success} = \sum_{i=1}^{n} P_i(n-i+1) = \frac{n+1}{2}\\ ASL_{unsuccess} = \sum_{j=1}^{n} Q_j(l_j-1) = \frac{1+2+...+n+n}{n+1} = \frac{n}{2} + \frac{n}{n+1}\\ \]

折半查找(二分查找)

graph LR id29((29))--id37((37))--id41((41))--id43((43)) id43((43))--43,+infinity id43((43))--37,43 id37((37))--id32((32))--id33((33)) id32((32))--29,32 id33((33))--33,37 id33((33))--32,33 id13((13))--id16((16))--id19((19))--19,29 id19((19))--16,19 id29((29))--id13((13))--id7((7))--id10((10))--10,13 id10((10))--7,10 id7((7))---infinity,7

(1)仅适用于顺序表
(2)代码

int binarySearch(SeqList L, ElemType key){
    int low, high, mid = 0, L.tableLen, 0;
    while(low <= high){
        mid = (low + high) / 2;
        if(L.elem[mid] == key)
            return mid;
        else if(L.elem[mid]  key)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}

(3)ASL

\[ASL = \frac{1}{n}\sum_{i=1}^{n} l_i = \frac{1}{n}(1*1+2*2+...+h*2^{h-1}) = \frac{n+1}{n} log_2(n+1)-1 = log_2(n+1)-1\\ h=[log_2(n+1)](向上取整) \]

查找11

low=7, high=43, mid=29
11<29
graph 7--low 10 13 16 19 29--mid 32 33 37 41 43--high
low=7, high=mid-1=19, mid=13
11<13
graph 7--low 10 13--mid 16 19--high 29 32 33 37 41 43
low=7, high=mid-1=7, mid=10
117
graph 7--low--mid 10--high 13 16 19 29 32 33 37 41 43
low=mid+1=10, high=10, mid=10
1010 ×
graph 7 10--low--mid--high 13 16 19 29 32 33 37 41 43
没找到,停在low

分块查找

(1)将查找表分为若干子块,块内可以无序,但块之间有序的

graph id24((24))--id((索引块24,54,78,88)) id21((21)) id6((6)) id11((11)) id8((8)) id22((22)) id32((32))--id((索引块24,54,78,88)) id31((31)) id54((54)) id72((72))--id((索引块24,54,78,88)) id61((61)) id78((78)) id88((88))--id((索引块24,54,78,88)) id83((83))

(2)ASL

\[n:长度\\ b:分块个数\\ s:每块s个记录\\ P:等概率\\ ASL = L_I+L_S = \frac{b+1}{2}+\frac{s+1}{2}=\frac{s^2+2s+n}{2s}\\ s=\sqrt{n},ASL=\sqrt{n}+1\\ 采用折半查找:ASL=L_I+L_S=[log_2(b+1)]+\frac{s+1}{2}(向上取整) \]

B树(多路平衡查找树)

\[m阶B树或空树\\ 每棵子树至多m棵子树,最多包含m-1个关键字\\ 若根节点不是终端节点,至少两棵子树\\ 除根结点外所有非叶节点至少[\frac{m}{2}](向上取整)棵子树(关键字)\\ \]

graph id[22]--id0[5,11] id[22]--id1[36,45] id0[5,11]--id00[1,3] id0[5,11]--id01[6,8,9] id0[5,11]--id02[13,15] id1[36,45]--id10[30,35] id1[36,45]--id11[40,42] id1[36,45]--id12[47,48,50,56]

标签:10,frac,--,mid,算法,查找,数据结构,ASL
From: https://www.cnblogs.com/Carrawayang/p/18049329

相关文章

  • 数据结构·线性表
    线性表一、逻辑结构和基本操作1.逻辑结构具有相同数据类型的n个数据元素的有限序列,表长n,n=0为空表表头:第一个元素表尾:最后一个元素除第一个元素外,每个元素有且仅有一个直接前驱除最后一个元素外,每个元素有且仅有一个直接后继2.基本操作initList(&L);len(L);locateE......
  • 质数筛算法详解
    在信息竞赛中,我们总是会遇到很多判断质数的题目,那么在这里就由我来给大家讲解一下质数筛算法(这里所有讲的算法都是基于筛出从\(1\)到\(n\)之间的素数的算法)。1.普通筛法最普通的筛法,也就是将前\(n\)个正整数一个一个来判断是否为素数,并且在判断素数的时候要从\(2\)枚举......
  • #SOR-序列超松弛算法
    \(\textbf{SOR(SuccessiveOver-Relaxation)}\)算法是一种用于解线性方程组的迭代方法,它通过引入松弛因子来加快收敛速度。SOR算法的基本步骤如下:将系数矩阵\(A\)分解为\(A=D-L-U\),其中D是A的对角线元素构成的对角矩阵,\(L\)是\(A\)的下三角部分(不含对角线)构成的矩阵,\(U\)是\(A\)......
  • 洛谷题单指南-二分查找与二分答案-P1182 数列分段 Section II
    原题链接:https://www.luogu.com.cn/problem/P1182题意解读:每段和的最大值越小,则分段数就越多,因此可以通过给定每段和的最大值,将分段数划分为两类:<=M,>M,对每段和的最大值进行二分即可。解题思路:二分的判定条件为,给定每段和的最大值,计算分段数,计算逻辑如下:依次遍历每一个数,求当前......
  • 基于四叉树的图像分割算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述        图像分割是计算机视觉和图像处理中的一项关键技术,旨在将图像划分为多个具有相似性质的区域。基于四叉树的图像分割算法是一种有效的分割方法,它通过递归地将图像划分为四个子......
  • 高级搜索算法学习笔记
    0.前言如有错误,欢迎各位大佬指出。前置芝士:深度优先搜索广度优先搜索1.何为高级搜索?在通常情况下,普通的深搜往往会超时,即使剪枝也无动于衷。对于广搜,我们一旦超时也很难进行优化。而这时,我们就需要对搜索的形态进行改变,将深搜和广搜进行升级,变形成为各种效率更高的高......
  • 数据结构之线性表(顺序存储表)
    php<?php/***CreatedbyPhpStorm.*User:SillyCat*Date:2024/3/2*Time:18:47*/classSequenceList{private$item=array();private$length=0;publicfunction__construct(){//$this->item=$item;......
  • 代码随想录算法训练营第三十四天| ● 860.柠檬水找零 ● 406.根据身高重建队列 ●
    柠檬水找零 题目链接:860.柠檬水找零-力扣(LeetCode)思路:注意对于20元的情况,有两种找零方式,            头一次见到这种情况,随便加一个标准输出才能通过的样例。classSolution{public:boollemonadeChange(vector<int>&bills){in......
  • 代码随想录算法训练营day11 | leetcode 20. 有效的括号、1047. 删除字符串中的所有相
    目录题目链接:20.有效的括号-简单题目链接:1047.删除字符串中的所有相邻重复项-简单题目链接:150.逆波兰表达式求值-中等题目链接:20.有效的括号-简单题目描述:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右......
  • 算法工程师面试常考手撕题
    手撕numpy写线性回归的随机梯度下降(stochasticgradientdescent,SGD)  在每次更新时用1个样本,可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,对于最优化问题,凸问......