二叉排序树用于动态查找
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 显然,同一个算法用不同的语言实现,或 者用不同的编译程序进行编译,或者在不 同的计算机上运行时,效率均不相同。
• 这表明使用绝对的时间单位衡量算法的效 率是不合适的。撇开这些与计算机硬件、 软件有关的因素,可以认为一个特定算法 “运行工作量”的大小,只依赖于问题的 规模(通常用整数量n表示),或者说,它 是问题规模的函数。
procedure search(num:longint); var top,end1,mid:longint;
begin top:=0;end1:=n; if end-top<=1 then mid:=end1; while (end1-top>1)and(a[top]<>num) do begin mid:=(top+end1) div 2; if num<=a[mid]Biblioteka Baiduthen top:=mid
软硬件等环境因素,有时容易掩盖算法本 身的优劣性。
事先分析估算的方法
• A)依据的算法选用何种策略; • B)问题的规模。例如求100以内还是
10000以内的素数; • C)书写程序的语言。对于同一个算法,实
现语言的级别越高,执行效率就越低; • D)编译程序产生的机器代码的质量; • E)机器执行指令的速度。
• 时间复杂度:
• 一个算法中的语句执行次数称为语句频度 或时间频度。记为T(n)。
例如在如下所示的两个N*N矩阵相乘的算法 中,“乘法”运算时“矩阵相乘问题”的基本 操作。 for i:=1 to n do for j:=1 to n do begin c[i,j]:=0; for k:=1 to n do c[i,j]:=c[i,j]+a[i,k]*b[k,j] end;
• 一个算法是由控制结构(顺序、分支和循 环)和原操作(指固有数据类型的操作) 构成的,则算法时间取决于两者的综合效 果。
• 为了便于比较同一问题的不同算法,通常 的做法是,从算法中选取一种对于所研究 的问题(或算法类型)来说是基本运算的 原操作,以该基本操作重复执行的次数作 为算法的时间量度。
时间复杂度
• 例:给出一个还有n个数的有序序列,要求查给定 的一个数x是否在序列中,若在则给出所在序列中 所处的位置。
输入:第一行输入两个数n和x 第二行为n个数
输出:x在序列中所处的位置的序号 样例:input: 6 61
12 35 58 60 61 100 output: 5
顺序查找
• 从线性表的第一个元素开始,依次将线 性表中的元素被查元素进行比较,若相等 则表示找到(即查找成功);若线性表中 所有的元素都与被查元素进行比较但都不 相等,则表示线性表中没有要找的元素 (即查找失败)。
• 选择排序: Procedure selectsort (var r:arraytype);
begin for i:=1 to n-1 do Begin k:=i; for j:=i+1 to n do begin if r[j]<r[k] then k:=j end; if k<>i then begin temp:=r[i]; r[i]:=r[k]; r[k]:=temp; end; end; end;
• 一般情况下,算法中基本操作重复执行的 次数是问题规模n的某个函数,用T(n)表示, 若有某个辅助函数f(n),使得当n趋近于无穷 大时,T(n)/f (n)的极限值为不等于零的常数, 则称f(n)是T(n)的同数量级函数。记作 T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复 杂度,简称时间复杂度。
procedure search2(num:longint); var i,j:longint; begin for i:=1 to n do
if a[i]=num then writeln(i); end;
二分查找法
若中间项的值等于 x ,则说明查到,查找结束。 若 x 小于中间项的值,则在线性表的前半部分 (即中间项以前的部分)以相同的方法进行查找; 若 x 大于中间项的值,则在线性表的后半部分 (即中间项以后的部分)以相同的方法进行查找; 这个过程一直进行到查找成功或子表长度为 0 (说明线性表中没有这个元素)为止。
整个算法的执行时间与该基本操作(乘法) 重复执行的次数N³成正比,记T(N)=O(N³)。
“O”的形式定义为:若f(n)是正整数n的一个 函数,则xn=O(f(n))表示存在一个正的常数 M,使得当n>=n0时都满足|xn|<=M|f(n)|
空间复杂度
• 是程序运行所以需要的额外消耗存储空间, 一般的递归算法就要有o(n)的空间复杂度了, 简单说就是递归集算时通常是反复调用同 一个方法,递归n次,就需要n个空间。 (这个空间到底多大?我们姑且把它当作 每次调用时分配的内存大小,到底多大, 它自己确定)
else end1:=mid; end; if a[top]=num then writeln(top); end;
显然,当有序线性表为顺序存储时才采
用二分法查找,并且,二分查找的效率要 比顺序查找高得多。可以证明,对于长度 为 n 的有序线性表,在最坏情况下,二分 查找只需要比较 log 2 n 次,而顺序查找需 要比较 n 次。
• 我们在判读算法的优劣时,往往是综合考 虑时间复杂度和空间复杂度两个因素,一 般是希望能够找到两个都省的方法,但事 实上我们往往需要牺牲时间复杂度来成全 空间,或牺牲空间来节省时间。因此我们 需要根据题目要求,选择侧重节省的因素。
• 更多的时候由于空间的耗费我们一般可以 容忍,所以我们会更关注时间复杂度对算 法的影响。
时间空间复杂度
算法效率的度量
• 算法执行时间需要通过依据该算法编制的 程序在计算机上运行时所消耗的时间来度 量。而度量一个程序的执行时间通常有两 种方法:
事后统计的方法
• 可以利用计算机的内部计时功能,先把程 序编写好运行一下进行计时。不过这种方 法有两个缺陷:
• 一是必须先编制好程序并运行; • 二是所得出的时间统计量依赖于计算机的