SelfOrganizing 自组织链表 ?Data Structures and Algorithms?
SelfOrganizing 自组织链表
引入 SkipList 跳跃链表的目的是加快查找的过程。
单向链表的双向链表需要进行顺序查找一定位某个元素或者查明该元素不在链表中,还可以用某种方法动态地组织链表,从而提高查找效率,这就是 自组织链表。这种组织依赖于数据的配置,因此,数据流需要重新组织链表中已有的节点。
SelfOrganizing 的基本算法
有许多不同的方法可用于 自组织链表,这里阐述其中 4 种:
- 前移法(Move-to-front method)。在找到需要的元素之后,把它放到链表的开头。
- 换位法(Transpose method)。在找到需要的元素之后,只要它不在表头,就与其前驱交换位置。
- 计数法(Count method)。根据元素访问的次数,对链表进行排序。
- 排序法(Ordering method)。根据被考察信息自身的属性,对链表排序。
图解:
MTF:
Transpose:
Count:
Ordering:
/* 比如按大写字母 ‘A’~‘Z’ 排序*/
SelfOrganizing 代码示范
SelfOrganizing.h
#ifndef _SELFORGANIZING
#define _SELFORGANIZING
#include <iostream>
template<class S>
class Node_SO // 双向链表
{
public:
S info;
Node_SO<S>* next;
Node_SO<S>* prior;
Node_SO();
};
template<class S>
Node_SO<S>::Node_SO()
{
next = NULL;
prior = NULL;
}
template<class S>
class Node_SOC // 双向链表, 为每个节点添加一个计数器,该节点每被访问一次,进行累加,
{
// 链表按计数器排序
public:
S info;
Node_SOC<S>* next;
Node_SOC<S>* prior;
unsigned int count;
Node_SOC();
};
template<class S>
Node_SOC<S>::Node_SOC()
{
next = NULL;
prior = NULL;
count = 0;
}
template<class S>
class SelfOrganizing
{
public:
SelfOrganizing();
bool Create(); // 创建空表
bool Empty() const; // 判断空表
unsigned int Length(); // 返回表长
void InsertToHead(S); // 在表头插入
void InsertToTail(S); // 在表位插入
void InitH(S[], unsigned int<