算法07 五大查找之:索引查找
时间:2022-05-04
本文章向大家介绍算法07 五大查找之:索引查找,主要内容包括索引查找的示意图、索引查找的代码实现、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
上一篇总结了二分查找,这一篇要总结的是索引查找。
关于索引,我们很容易地联想到数据库中的索引,建立了索引,可以大大提高数据库的查询速度。
索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法,索引查找的基本思想是:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。
在实现索引查找算法前需要弄清楚以下三个术语。
(1)主表。即要查找的序列。
(2)索引项。一般我们会将主表分成几个块,每个块建立一个索引,这个索引就叫索引项。
(3)索引表。即索引项的集合。
同时,索引项包括以下三点。
(1)index,即索引项在主表的关键字。
(2)start,即块内的第1个元素在主表中的位置。
(3)length,即块的长度。
索引查找的示意图
示意图如下:
索引查找的代码实现
代码:
IndexItem.java
public class IndexItem {
public int index;
public int start;
public int length;
public IndexItem(int index, int start, int length) {
this.index = index;
this.start = start;
this.length = length;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
}
IndexSearch.java
public class IndexSearch {
// 主表
static int[] mainList = new int[]{
101, 102, 103, 104, 105, 0, 0, 0, 0, 0,
201, 202, 203, 204, 0, 0, 0, 0, 0, 0,
301, 302, 303, 0, 0, 0, 0, 0, 0, 0
};
// 索引表
static IndexItem[] indexItemList = new IndexItem[]{
new IndexItem(1, 0, 5),
new IndexItem(2, 10, 4),
new IndexItem(3, 20, 3)
};
/**
* 索引查找算法
*
* @param key 给定值
* @return 返回给定值在表中的位置
*/
public static int indexSearch(int key) {
IndexItem item = null;
// 建立索引规则
int index = key / 100;
// ① 遍历索引表,找到对应的索引项
for (int i = 0; i < indexItemList.length; i++) {
// 找到索引项
if (indexItemList[i].index == index) {
item = indexItemList[i];
break;
}
}
// 索引表中不存在该索引项
if (item == null) {
return -1;
}
// ② 根据索引项,在主表中查找
for (int i = item.start; i < item.start + item.length; i++) {
if (mainList[i] == key) {
return i;
}
}
return -1;
}
/**
* 插入数据
*
* @param key 要插入的值
* @return true表示插入成功,false表示插入失败
*/
public static boolean insert(int key) {
IndexItem item = null;
// 建立索引规则
int index = key / 100;
int i = 0;
// 遍历索引表,找到对应的索引项
for (i = 0; i < indexItemList.length; i++) {
if (indexItemList[i].index == index) {
item = indexItemList[i];
break;
}
}
// 索引表中不存在该索引项
if (item == null) {
return false;
}
// 根据索引项将值插入到主表中
mainList[item.start + item.length] = key;
// 更新索引表
indexItemList[i].length++;
return true;
}
/**
* 遍历打印
*/
public static void display(int[] list) {
System.out.println("********展示开始********");
if (list != null && list.length > 0) {
for (int i = 0; i < list.length; i++) {
System.out.print(list[i] + " ");
if ((i + 1) % 10 == 0) {
System.out.println("");
}
}
}
System.out.println("********展示结束********");
}
public static void main(String[] args) {
System.out.println("********索引查找********");
System.out.println("");
System.out.println("原始数据:");
display(mainList);
System.out.println("");
int value = 106;
System.out.println("插入数据:" + value);
// 插入成功
if (insert(value)) {
System.out.println("插入后的主表:");
display(mainList);
System.out.println("");
System.out.println("元素" + value + "在列表中的位置为:" + indexSearch(value));
}
}
}
运行结果:
- [接口测试 - http.client篇] 17 http.client之入门级接口测试框架
- 评论JS插件~多说+畅言
- jQuery HTML5 Uploader
- 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
- [接口测试 - http.client篇] 16 基于http.client之POM实战一下
- 数论部分第一节:素数与素性测试【详解】
- ProtoBuf 序列化工具组件
- C++STL vector简单使用练习1
- 小解Redis 系列
- 小侃 SQL加密和性能
- 接口测试 | 25 requests + pytest测试实例
- 接口测试 | 24 requests + unittest集成你的接口测试
- 接口测试 23 requests基础入门二
- 写让别人能读懂的代码+网页性能管理详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- typecho显示网站运行时间
- 从 Dagger 到 Hilt,谷歌为何执着于让我们用依赖注入?
- 为什么非对称加密比对称加密慢?
- 如何优化Nginx的处理性能
- 一键生成前后端代码,Mybatis-Plus代码生成器让我舒服了
- 各类好玩免费API推荐,强烈建议收藏
- 回敬Python蹭女神热度助发朋友圈,Java实现头像分成九宫图,再生成拼图头像
- java作业:实现数组翻转
- windows下搭建spark测试环境
- 微信小程序实时语音识别实践
- 轻量安全的部署方案
- 阿里2020.7.31笔试
- 聊聊dubbo-go的PrometheusReporter
- 聊聊dubbo-go的apolloConfiguration
- 看了这篇,关于浏览器缓存你还有哪些疑问?