No42.检索--自组织线性表
线性表在大多数情况下根据关键码值进行排序,再进行检索。但是我们也可以不通过排序,而是估算记录被访问的频率更改记录在线性表中的位置。
三个估算方法(启发式规则):
1.。类似于LFU(最不经常使用),每当访问一条记录时,若这条记录的访问数大于排在它前面的记录的访问数,这条记录就会在线性表中向前移动。
缺点:一旦一条记录被访问了很多次,不管将来的访问历史如何,它都会一直在线性表的前面。
2.。类似于LRU(最近最少使用),若找到一条记录,就把它放在线性表的最前面。移至前端方法对访问频率的局部变化能很好地反应,因为当一条记录在一段时间内被频繁访问时,那么在这段时间它会靠近线性表的前端。
3.。若找到一条记录,则把这条记录与它在线性表中的前一条记录交换位置。
例子:
假定有八条记录,其关键码值为从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