数据结构之大体脉络(二)

来源:互联网 发布:淘宝保证金必须要交吗 编辑:程序博客网 时间:2024/05/21 14:01
今天来总结下查找和内部排序
 
查找
  静态查找:不改变查找表中的内容。
  动态查找:对表中数据元素进行插入或删除。
1.顺序表的静态查找
  (1)顺序查找
  方法:将关键字放入0号单元,查找方向从n到1,逐个进行元素的关键字和给定值的比较
  时间复杂度:O(n)
  (2)折半查找(二分查找)
   方法:假设为升序表,先确定查找区域,将关键字与该区域的中间元素的关键字进行比较,若小于则对左区域的
  再选择中间元素与之比较,直到查找成功或该区域中只剩一个元素;反之亦然。
  注:前提条件必须是有序表,可以画折半查找树。
    时间复杂度:O(log?n)
   (3)分块查找
    分块查找概念:将查找表分成若干个子表,块内数据元素无序,但块与块之间是有序的,并对块建立索引表。
    方法:用给定的关键字在索引表中检测索引项,确定待查记录所在块;在块中顺序查找。
    分块查找适用于对大型数据的查找
2.树表的动态查找
  1.二叉排序树(二叉查找树)
   性质:(1)若左子树不空,则左子树上的所有结点的值均小于根结点的值
         (2)若右子树不空,则左子树上的所有结点的值均大于根结点的值
         (3)左右子树也是二叉排序树
   注:对二叉排序树进行中序遍历可得到有序序列。
  查找:(1)判断查找树是否为空,如为空,则查找失败,否则进行下一步。
        (2)若关键字等于根结点的值,则查找成功;若小于,则查找左子树;若大于,则在右子树上继续查找。
  插入和构造:按上述性质可得到。
  2.平衡二叉树
   性质:(1)若不为空树,左子树和右子树的深度差的绝对值小于等于1;
         (2)左子树和右子树都是平衡二叉树。
   构造:对失去平衡的调整有LL型,RR型,LR型,RL型四种
        (1)LL型:进行右单旋转,如
        
        (2)RR型:进行左单旋转,和LL型方法类似,只不过方向不同
        (3)LR型:先左后右旋转,如
       
       
        (4)RL型:先右后左旋转
   3.B-树(平衡因子等于0)
   B-树是一种平衡查找树,适合在磁盘等直接存储设备上组织动态的查找表(只适合随机查找)
  对于m(m>=3)阶B-树
  性质:(1)树中每个结点至多有m课子树
        (2)若根结点不是叶子结点,则至少有两颗子树
        (3)除根结点的所有非终端结点至少有【m/2】颗子树,取上限
        (4)每个非终端结点包含,(关键字个数,指针,关键子,指针...)
         (5)所有的叶子结点在同一层上
 插入和生成:从底向上生成的,如序列{5,19,21,56,38,13,52}
    
   4.B+树
   对于m(m>=3)阶B+树
   性质:(1)树中每个结点至多有m课子树
        (2)若根结点不是叶子结点,则至少有两颗子树
        (3)除根结点的所有非终端结点至少有【m/2】颗子树,取上限
        (4)每个非终端结点包含,(关键字个数,指针,关键子,指针...)
         (5)所有的叶子结点包含全部关键字及指向相应记录的指针,而且叶结点的本身按关键字的由小到大顺序链接。
  注:B+树可以容纳更多的条目,它同时支持随机查找和顺序查找,更适合文件索引系统。
3.散列(Hash)表查找
  概念:使用H函数计算关键字的地址。
  构造散列函数时需要解决两个问题:
   (1)构造好的散列函数。所选散列函数对关键字的散列地址,应在散列表集中,大致均匀的分布,减少冲突和空间
  浪费;所选函数尽可能的简单提高计算速度。
   (2)制定处理冲突的方法。
  构造方法:最常用的为除留余数法,即对于表长为m,H(key)=key%p(p<=m)
  注:该方法的关键在于选择合适的p,一般来说,p 取质数,最好是小于等于m的最大质数。
  处理冲突的方法:
   1.开放定址法Hi(key)=(H(key)+di+m)%m
     (1)线性探测法
         di=i(i=1,2...m-1)
         Hi(key)=(H(key)+i)%m
      (2)二次探测法
        di=12,-12,22,-22,...k2,-k2(k<=m/2)
      (3)双重散列探测法
         使用两个散列函数
    2.再散列法
     Hi(key)=RHi(key)(i=1,2,...k)
    3.链地址法(拉链法)
    4.建立一个公共的溢出域
内部排序
 
 插入排序

 1.直接插入排序
   基本思想:每次将一个待排序的数据元素(或记录),按关键码大小插入到前面已经排好序的子序列中,并使子序列
 保持有序,直到全部记录插入完成为止。
   性能分析
   (1)最好情况      
         比较次数:Σ1=n-1         i[2,n]
         移动次数:Σ2=2(n-1)    i[2,n]
   (2)最坏情况
         比较次数:Σi=1/2(n+2)(n-1)        i[2,n]
         移动次数:Σ(i+1)=1/2(n+4)(n-1)    i[2,n]
    (3)平均情况
         比较次数和移动次数:i/2
         最好和最坏情况下的时间复杂度为O(n2)
    (4)稳定性:稳定
 2.折半插入排序
    基本思想:其基本操作仍是将有序部分插入一个记录,采用折半法确定插入位置,并在位置确定后将该位置之后的元
素依次后后移。
 注:折半插入排序只顺序存储序列。
   性能分析
   (1)时间性能分析
         比较次数:O(nlog?n)
         移动次数;O(n2)
    (2)空间性能分析
         s(n)=O(1)
    (3)稳定性:稳定
 3.希尔排序
   基本步骤:
    (1)按选定的距离分组,假设相邻的两个元素距离为1,将彼此指定距离的元素划为一组,初始时选定一个适当的距
    离d1;
    (2)在每组内进行插入排序
    (3)修改距离,选一个小于d1的距离d2;
     (4)重复以上三个步骤的分组和排序,直到di=1,即所有的记录成为一组为止。
   注:尽量避免增量序列的值互为倍数;增量序列中的最后一个增量必须为1.
   (1)时间性能分析
        最好情况:O(n)
        最坏情况:O(n2)
    (2)空间性能分析
         s(n)=O(1)
    (3)稳定性:不稳定

  交换排序
  1.冒泡排序
    基本思想:基于相邻记录的两两比较,通过交换让关键码小的的记录向上浮(前移),关键码大的记录向下沉(后移)。
    性能分析
   (1)最好情况
         比较次数:n-1
         交换次数:0
   (2)最坏情况  
         比较次数:Σ(n-i)=?n(n-1)         i[2,n]
         移动次数:Σ(n-i)=?n(n-1)    i[2,n]
   (3)平均情况  
         最坏的平均时间复杂度O(n2)
    (4)空间性能分析
         s(n)=O(1)
    (5)稳定性:稳定
   2.快速排序
     基本思路:其核心操作是划分,它对序列的划分不是随意进行而是尽量将原序列划分为两半。
     基本步骤:
      (1)一般选择首元素作为轴值,分别设置两个指针i,j,指向首尾
      (2)从末尾元素开始,和轴值比较,若大于轴值,则执行减1操作;若小于轴值,则将该记录存放在i处,i++;
      (3)从i进行右侧扫描,若小于轴值,则i++;否则将记录存放在j出,j--;
      (4)重复(2)(3)步骤,直到每组记录为一个为止。
    例如:49,38,65,97,76,13,27,65
           以49为轴值:【27,38,13】49【76,97,65,65】
    分别以27,76为轴值:13,27,38,49【65,65】76,97
           以65为轴值:13,27,38,49,65,65,76,97
       性能分析
   (1)最好情况
         O(nlog?n)
   (2)最坏情况  
         O(n2)
   (3)平均情况  
         O(nlog?n)
    (4)空间性能分析
         s(n)=O(log?n)
    (5)稳定性:不稳定
 选择排序(移动次数少)
   1.直接选择排序

     基本思路:在序列中选择最小的和第一个交换,在除第一个之外的中选择最小的和第二个交换,以此类推。
      性能分析
   (1)最好情况
         O(n2)
   (2)最坏情况  
         O(n2)
   (3)平均情况  
        O(n2)
    (4)空间性能分析
         s(n)=O(1)
    (5)稳定性:稳定
   2.堆排序

    堆:设有n个元素的序列{k1,k2...kn},当且仅当满足下属关系之一时称为堆。
         (1)ki<=k2i,ki<=k2i+1或(2)ki>=2i;ki>=2i+1    (i=1,2...n/2)
       前者为大顶堆。后者为小顶堆。
    堆排序基本思路:如小顶堆,输出根结点,将最后一个元素调整到根结点,与左右结点比较,与最小的交换直到
    满足堆为止,重复此操作,直到与最后一个交换。
       性能分析
   (1)最好情况
         O(nlog?n)
   (2)最坏情况  
         O(nlog?n)
   (3)平均情况  
        O(nlog?n)
    (4)空间性能分析
         s(n)=O(1)
    (5)稳定性:不稳定
   3.归并排序

    归并排序一般分为2-路归并(内部排序),多路归并(一般用于外部磁盘数据排序)。
    2-路归并递归排序:先将子序列划分为两个子序列,再将子序列划分为两个子序列,直到序列中只有一个元素,
   在将这些序列两两排序合并,最后为有序序列。
     性能分析
   (1)最好情况
         O(nlog?n)
   (2)最坏情况  
         O(nlog?n)
   (3)平均情况  
        O(nlog?n)
    (4)空间性能分析
         s(n)=O(n)
    (5)稳定性:稳定
   4.基数排序
更多内容请看上篇http://blog.csdn.net/jingmo4129/article/details/52811162

     
 
0 0
原创粉丝点击