ASL吐血整理&&数据结构查找

ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数成为平均查找长度。

 

 

 

 

 

 

 

其中p_{i}是查找表中第i个记录的概率,且\sum_{i=1}^{n}p_{i}=1,c_{i}未找到表中与给定值相等的值,所要与关键字比较过的次数。

(一些概念补充(不那么重要):

  查找表:同一类数据元素(或记录)所构成的集合。

 关键字:是数据元素(或记录)中某个数据项的值,用他可以标识一个数据元素(或记录),若此关键字可以唯一的标识一个,称                 为主关键字0。反之,若可以识别若干称为次关键字。

动态查找链表,静态查找链表:若在查找的同时对表修改操作(删除,插入等),称为动态链表。反之,静态链表。)

线性表查找:

时间复杂度O(n)

1.查找成功:          

     分析:    查找方式为从头扫到尾,找到待查找元素即查找成功,若到尾部没有找到,说明查找失败。所以说,Ci(第i个元素                        的比较次数)在于这个元素在查找表中的位置,如第0号元素就需要比较一次,第一号元素比较2次......第n号元素要                      比较n+1次。所以Ci=i。

2.查找失败:       

     分析:当待查找元素不在查找表中时,也就是扫描整个表都没有找到,即比较了n次,查找失败

3.适用情形:算法简单,对查找表结构无任何要求,有序与否都行

                     n太大时,查找效率低。

折半查找:

时间复杂度O(log_{2}n

待查找表是有序表,这是折半查找的要求。在折半查找中,用二叉树描述查找过程,查找区间中间位置作为根,左子表为左子树,右子表为右子树,因此这颗树也被成为判定树(decision tree)或比较树(Comparison tree)。查找方式为,先与树根结点进行比较,若k小于根,则转向左子树继续比较,若k大于根,则转向右子树,递归进行上述过程,直到查找成功或查找失败。k是关键字。

1.查找成功

  分析:折半查找也称二分查找,成功的折半查找恰好是走了一条从判定树根到被查节点的路径,比较关键字个数恰为该结点在                 树中的层数,具有n个结点的判定树的深度为[log_{2}n]+1.

            假设判定树结点个数是n=2^{h}-1,则判定树深度是h=log_{2}(n+1),而查找每个记录概率是p_{i}=i/n。

 例如:

((层次*该层结点数)/总结点数)

2.查找失败

共12个空节点,而查找每个记录为空概率是p_{i}=i/n=1/12。

方格结点是失败的结点,本身不存在,不需要比较到他自己,只需要比较到他的父节点即可,因此为3*4;

(eg:要在树中查找1,只用依次搜索25,10,2就行了,发现比2小就不要找了,因为已经知道2没有左子树,总共比较了3次。)

3.适用情形:比较次数少,查找效率高,只用于顺序存储的有序表,不适用于经常修改操作(删除插入等)。

分块查找:

时间复杂度为O(log₂(m)+N/m),m为分块的数量,N为主表元素的数量,N/m 就是每块内元素的数量

在原表的基础上建立一个分块有序表(也称子表方便我后面描述)(每个分块都输有序的,第二个分块的记录大于第一个分块记录)。每个子表包含两个,一是关键字项(该字表内最大的关键字),二为指针项(子表中第一个记录的位置)。

先确定待查记录所在的块,然后在块中按顺序查找或折半查找(子表中的记录可能任意排列)。

1.查找成功:

ASL_{bs}=L_{b}+L_{w}

L_{b}是查找索引表确定所在块(总块)的ASL,L_{w}是在块中查找元素的ASL。

将长度为n的表均匀的分为b块,每块含有s个记录,b=n/s;

所以在总块中查找的概率是1/b;分块中每个记录查找的概率是1/s;

   分块用顺序表

   分块用折半查找

2.适用情形

 可以快速进行修改操作,块内可以无序,缺点就是新增一个索引表。

如有错误,请联系我。谢谢你可以让我及时发现!

  • 37
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是数据结构查找排序实验的步骤和示例: 1. 二叉排序树查找: - 构造二叉排序树:根据给定的数据,构造一个二叉排序树。 - 查找元素:在二叉排序树中查找指定的元素。 示例: ```python # 构造二叉排序树 class Node: def __init__(self, value): self.value = value self.left = None self.right = None def insert(root, value): if root is None: return Node(value) if value < root.value: root.left = insert(root.left, value) else: root.right = insert(root.right, value) return root def construct_tree(data): root = None for value in data: root = insert(root, value) return root # 查找元素 def search(root, value): if root is None or root.value == value: return root if value < root.value: return search(root.left, value) return search(root.right, value) # 测试数据 data = [150, 70, 160, 190, 10, 55, 175] root = construct_tree(data) # 查找元素 elements = [150, 70, 160, 190, 10, 55, 175] for element in elements: result = search(root, element) if result: print(f"元素 {element} 在二叉排序树中找到了") else: print(f"元素 {element} 在二叉排序树中未找到") ``` 2. 二分查找: - 准备有序数据表:准备一个有序的数据表。 - 二分查找元素:在有序数据表中使用二分查找算法查找指定的元素。 示例: ```python def binary_search(data, target): low = 0 high = len(data) - 1 while low <= high: mid = (low + high) // 2 if data[mid] == target: return mid elif data[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 测试数据 data = [10, 55, 70, 150, 160, 175, 190] elements = [150, 70, 160, 190, 10, 55, 175] # 二分查找元素 for element in elements: index = binary_search(data, element) if index != -1: print(f"元素 {element} 在数据表中的下标为 {index}") else: print(f"元素 {element} 在数据表中未找到") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值