No42.检索--自组织线性表

懵懂的女人 提交于 2020-01-29 00:19:03

线性表在大多数情况下根据关键码值进行排序,再进行检索。但是我们也可以不通过排序,而是估算记录被访问的频率更改记录在线性表中的位置。

三个估算方法(启发式规则):

1.\color {red}{计数方法}。类似于LFU(最不经常使用),每当访问一条记录时,若这条记录的访问数大于排在它前面的记录的访问数,这条记录就会在线性表中向前移动。
缺点:一旦一条记录被访问了很多次,不管将来的访问历史如何,它都会一直在线性表的前面。

2.movetofront\color{green}{移至前端方法(move-to-front)}。类似于LRU(最近最少使用),若找到一条记录,就把它放在线性表的最前面。移至前端方法对访问频率的局部变化能很好地反应,因为当一条记录在一段时间内被频繁访问时,那么在这段时间它会靠近线性表的前端。

3.transpose\color{orange}{转置方法(transpose)}。若找到一条记录,则把这条记录与它在线性表中的前一条记录交换位置。

例子:

假定有八条记录,其关键码值为从A到H,并且最初的排列顺序为:A,B,C,D,E,F,G,H(字母顺序)。当按照下面的字符流对这八条记录进行访问时,上面三种不同的启发式方法分别需要进行多少次比较。
F D F G E G F A D F G E

1.按照计数方法,

第一次:F1 A0 B0 C0 D0 E0 G0 H0
第二次:F1 D1 A0 B0 C0 E0 G0 H0
第三次:F2 D1 A0 B0 C0 E0 G0 H0
第四次:F2 D1 G1 A0 B0 C0 E0 H0
第五次:F2 D1 G1 E1 A0 B0 C0 H0
第六次:F2 G2 D1 E1 A0 B0 C0 H0
第七次:F3 G2 D1 E1 A0 B0 C0 H0
第八次:F3 G2 D1 E1 A1 B0 C0 H0
第九次:F3 G2 D2 E1 A1 B0 C0 H0
第十次:F4 G2 D2 E1 A1 B0 C0 H0
第十一次:F4 G3 D2 E1 A1 B0 C0 H0
第十二次:F4 G3 D2 E2 A1 B0 C0 H0
最后线性表中的记录顺序为:F G D E A B C H
需要比较的次数为:6+5+1+7+7+3+1+5+3+1+2+4=45

2.按照移至前端方法,

第一次:F A B C D E G H
第二次:D F A B C E G H
第三次:F D A B C E G H
第四次:G F D A B C E H
第五次:E G F D A B C H
第六次:G E F D A B C H
第七次:F G E D A B C H
第八次:A F G E D B C H
第九次:D A F G E B C H
第十次:F D A G E B C H
第十一次:G F D A E B C H
第十二次:E G F D A B C H
最后线性表中的记录顺序为:E G F D A B C H
需要比较的次数为:6+5+2+7+7+2+3+5+5+3+4+5=54

3.按照转置启发式规则

第一次:A B C D F E G H
第二次:A B D C F E G H
第三次:A B D F C E G H
第四次:A B D F C G E H
第五次:A B D F C E G H
第六次:A B D F C G E H
第七次:A B F D C G E H
第八次:A B F D C G E H
第九次:A B D F C G E H
第十次:A B F D C G E H
第十一次:A B F D G C E H
第十二次:A B F D G E C H
最后线性表中的记录顺序为:A B F D G E C H
需要比较的次数为:6+4+5+7+7+7+4+1+4+4+6+7=62

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!