从顺序查找来看平均时间复杂度分析的一般化方法

顺序查找是在n 个元素的列表中查找一个给定项(或者说查找键)的一个简单的算法。它会检查列表中的连续元素,直到发现了匹配查找键的元素或者到达了列表的终点。

我们假设对输入规模为n 的数据做若干次查找,为了分析该算法的平均时间复杂度,还需要对规模为n 的输入做一些假设。

标准的假设是:

  • 成功查找的概率是P(0 ≤ P ≤ 1)
  • 对于任意的正整数i(1 ≤ i ≤ n),第一次匹配发生在列表第i 个位置的概率是相同的

基于这种假设,容易得出,在成功查找的情况下,对于任意的i,第一次匹配发生在列表的第i 个位置的可能性是p/n,并且在这种情况下该算法所做的比较次数显然是i。而在不成功查找的情况下,比较的次数是n,发生的概率是1-P。

因此,键值比较的平均次数:

Cavg(n) = 1·P(比较次数为1) + 2·P(比较次数为2) + 3·P(比较次数为3) + ... + n·P(比较次数为n) + n·P(查找失败)

     = 1·P/n + 2·P/n + ... + n·P/n + n(1-P)

    = P(n+1)/2 + n(1-P)

我们可以用一些简单的例子来验证这个一般性方程的正确性,例如,如果 P = 1(查找一定会成功的情况),顺序查找所做的键值比较的平均次数是(n+1)/2,这意味着,平均来说,该算法大约要检查表中一半的元素。如果P = 0(查找一定不成功的情况下),键值比较的平均次数将是n,因为这种情况下,算法会对列表中的n 个元素全部检查一遍。

从这个简单的例子中可以发现,平均效率的研究比起最差效率研究(对于本例Cworst(n) = n)和最优效率研究(对于本例Cbest(n)  = 1,同Cworst一样,它们几乎都是显然的)要困难的多。因为我们需要得到或者假设各类输入的概率分布(虽然这种假设看起来很合理,但是其正确性往往很难验证),来推导出我们希望得到的基本操作的平均次数。

然而真的有必要研究算法的平均效率吗?答案是很有必要。因为有很多重要的算法的平均效率比它们过于悲观的最差效率要好得多。所以,如果没有平均效率分析的话,计算机科学家可能会错失很多重要的算法。

最后,从前面的讨论中可以了解到,我们不能用最优效率和最差效率求平均数的方法来求得平均效率,虽然这个平均数偶尔会和平均效率一致,但它并不是进行平均效率分析的规范方法。

reference:Introduction to The Design and Analysis of Algorithms_Anany Levitin

时间: 2024-10-06 03:39:43

从顺序查找来看平均时间复杂度分析的一般化方法的相关文章

算法-符号表的实现(顺序查找和二分查找)

符号表是一种存储键值对的数据结构,支持两种操作插入和查找,就是将一组新的键值对存入表中然后根据给定的键得到对应的值,在编程语言中常用Dictionary原理类似.符号表是一种典型的抽象数据结构,在生活之中应用的场景也很多,可以根据钥匙开门,域名解析的时候的IP地址查询,字典和图书的简介和页数,key和value是密不可分的,通过key我们可以很快找到我们需要的value. 无序链表的顺序查找 主要通过Node节点存储数据,之前的博客中有关于链表的实现,详情可参考之前的博客,代码有注释就解释太多了

转:线性表的查找-顺序查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.1.htm 顺序查找(Sequential Search)     在表的组织方式中,线性表是最简单的一种.顺序查找是一种最简单的查找方法. 1.顺序查找的基本思想    基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较.若当前扫描到的结点关键字与K相等,则查找成功:若扫描结束后,仍未找到关键字等于K的结点,则

顺序查找(Sequential Search)

1.定义 顺序查找又叫线性查找,是最基本的查找技术. 2.基本思想 从表的一端开始(第一个或最后一个记录),顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较.若当前扫描到的结点关键字与K相等,则查找成功:若扫描结束后,仍未找到关键字等于K的结点,则查找失败. 3.存储结构 顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构(使用单链表作存储结构时,扫描必须从第一个结点开始). 注意:单链表为什么从第一个扫描,而不是最后一个,这与其存储结构有关,单链表名字即表示第一个第

静态查找表:顺序查找、折半查找、分块查找

引言: 除去各种线性和非线性的数据结构外.另一种在实际应用中大量使用的数据结构--查找表.查找表是由同一类型的数据元素构成的集合. 对查找表常常进行的操作有:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素.对查找表仅仅作前两种统称为"查找"的操作,则称此类查找表为静态查找表. 若在查找过程中同一时候插入查找表中不存在的数据元素,或者从查找表中删

14.查找概论与顺序查找

一.查找概论 1.查找:即根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或纪录).若表中不存在关键字等于给定值的纪录,则称查找不成功,此时查找的结果可给出一个"空"纪录或"空"指针.另外,查找表按照操作方式来分有两大种:静态查找表和动态查找表. (1)查找表(Search table):是由同一类型的数据元素(或纪录)构成的集合: (2)关键字(Key):是数据元素中某个数据项的值,又称为键值,用它可以标志一个数据元素,也可以标志一个纪录的某个数

算法时间复杂度分析基础

摘要      本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. 前言      通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度.算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上

常用的排序、查找算法的时间复杂度和空间复杂度

常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 插入排序 O(n2) O(n2) 稳定 O(1) 选择排序 O(n2) O(n2) 稳定 O(1) 二叉树排序 O(n2) O(n*log2n) 不一顶 O(n) 快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n) 堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1) 希尔排序 O O 不稳定 O(1) 查

算法——蛮力法之顺序查找和蛮力字符串匹配

接着昨天的选择排序和冒泡排序之后,今天来实现一下顺序查找和蛮力字符串匹配两个算法. 顺序查找就是将给定的查找键和列表周玲的每个元素进行比较,直到找到一个匹配成功的元素返回该元素下标,查找成功,或者查找整个列表二没有匹配元素,查找失败.这里记录一下限位器版顺序查找方法.限位器就是指将查找键添加到列表最后,这样在查找的过程中,不用再每次都判断是否到达列表尾部来判断查找是否失败,而是在查找结束后,判断匹配元素下标是否小于n(假设列表有n个元素)来判断查找是否成功.下面是限位器版顺序查找算法: 限位器版

查找算法(I) 顺序查找 二分查找 索引查找

查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录. 若没有找到满足条件的记录,则返回特定值,表明查找失败:若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理:若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一