查找——索引顺序表和倒排表

8.3 索引顺序表和倒排表

当数据表中的数据元素个数n很大时,如果用顺序查找结构,则查找效率极低。如果采用有序表存储形式的折半查找,则为了维持数据表的有序性,时间开销很大;而且,当数据表很大时,计算机内存的容量可能不够。这时可采用索引方法来实现存储和查找。

8.3.1 索引顺序表

  1. 索引顺序表一般由主表索引表两个部分组成,两者均采用顺序存储结构。
    主表中存放数据元素的全部信息索引表中存放数据元素的主键字和索引信息

(1)完全索引

  1. 在图8-3所示的学生信息表的例子中,一个索引项对应数据表中一个数据元素,这时的索引结构叫作稠密索引也称完全索引。稠密索引结构适用于当数据元素在外存中按加入次序存放而不是按关键字有序存放的情形。
    在这里插入图片描述
  2. 完全索引表中关键字分块有序存放,即把所有n个索引项分为m个块 (子表),井且后一个子表中所有的关键字均大于前一个子表中所有的关键字,而在同一子表中所有关键字的次序任意。分块有序,索引按照关键字的大小建立,可知大于某个值或者小于某个值可以到哪个块里面去查找。经典的分块查找要求块间有序、块内也有序,如果块与块无序就无法建立索引。
  3. 分块查找的具体实现
    转载自:https://www.cnblogs.com/ciyeer/p/9067048.html
#include <stdio.h>
#include <stdlib.h>
struct index {
      //定义块的结构
  int key;
  int start;
} newIndex[3];  //定义结构体数组
int search(int key, int a[]);
int cmp(const void *a,const void* b){
   
  return (*(struct index*)a).key>(*(struct index*)b).key?1:-1;
}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要建立一个简单的索引表,可以按照以下步骤进行: 1. 读取文本文件,将每个文档中的单词分解成一个个的词项。 2. 对每个词项建立一个包含该词项的文档列表。 3. 对文档列表进行排序,可以按照文档编号或者其他排序方式进行排序。 4. 建立一个词项与文档列表的映射关系表。 以下是一个示例代码: ``` import os # 读取文本文件,将每个文档中的单词分解成一个个的词项 def get_words(file_path): with open(file_path, 'r') as f: return f.read().split() # 对每个词项建立一个包含该词项的文档列表 def build_index(file_dir): index = {} for file_name in os.listdir(file_dir): file_path = os.path.join(file_dir, file_name) words = set(get_words(file_path)) for word in words: if word not in index: index[word] = [] index[word].append(file_name) return index # 对文档列表进行排序 def sort_index(index): for word in index: index[word].sort() # 建立一个词项与文档列表的映射关系表 def build_mapping(index): mapping = {} for word in index: mapping[word] = ','.join(index[word]) return mapping # 示例 file_dir = './documents' index = build_index(file_dir) sort_index(index) mapping = build_mapping(index) print(mapping) ``` 在上面的示例代码中,`file_dir` 是包含文本文件的文件夹,`build_index` 函数会对每个文本文件建立索引表,`sort_index` 函数会对文档列表进行排序,`build_mapping` 函数会建立一个词项与文档列表的映射关系表。最后,我们可以打印出这个映射关系表,得到每个词项对应的文档列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值