分块查找(索引顺序表查找)

分块查找:分块查找又称索引顺序查找,它是顺序查找的一种改进方法。

方法描述:将n个数据元素“按块有序”划分为m块(m<=n)。每一块中的数据元素不必有序,但块与块之间必须“按块有序”,即第1快中的任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都小于第3块中的任一元素,……

图示分块如下:

操作步骤:

1、先选取各快中的最大关键字构成一个索引表

2、查找分两部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后在已确定的快中用顺序法进行查找。

分块查找平均查找长度:

设长度为n的表均匀地分成b块,每块含有s个记录,则b=n/s;

顺序查找所在块,分块查找的平均查找长度=(b+1)/2 + (s+1)/2 = (n/s+s)/2+1;

折半查找所在块,分块查找的平均查找长度=log2(n/s+1)+s/2;

优点:在表中插入或删除一个记录时,只要找到该记录所在块,就在该块中进行插入或删除运算(因快内无序,所以不需要大量移动记录)。

缺点:增加了一个辅助数组的存储空间和将初始表分块排序的运算。

性能:介于顺序查找和二分查找之间。

示例(block.c):

#include <stdio.h>
#include <stdlib.h>

#define MAX 3
#define MAXSIZE 18

typedef int ElemType;
typedef struct IndexItem{
	ElemType index;
	int start;
	int length;
}IndexItem;
IndexItem indexlist[MAX];

ElemType MainList[MAXSIZE] = {22, 12, 13, 8, 9, 20, 33, 42, 44, 38, 24, 48, 60, 58, 74, 49, 86, 53};

int sequential(IndexItem indexlist[], ElemType key)
{
	int index;
	if(indexlist[0].index >= key) return 1;
	for(index = 1; index <= MAX; index++){
		if((indexlist[index-1].index < key)&&(indexlist[index].index >= key))
				return index+1;
	}
	return 0;
}

int mainsequential(ElemType MainList[], int index, ElemType key)
{
	int i, num=0;
	for(i = 0; i < index-1; i++){
		num += indexlist[i].length;
	}
	for(i = num; i < num+indexlist[index-1].length; i++){
		if(MainList[i] == key) return i+1;
	}
	return -1;
}

int
main(void)
{
	indexlist[0].index = 22;
	indexlist[0].start = 1;
	indexlist[0].length = 6;
	indexlist[1].index = 48;
	indexlist[1].start = 7;
	indexlist[1].length = 6;
	indexlist[2].index = 86;
	indexlist[2].start = 13;
	indexlist[2].length = 6;
	int index = sequential(indexlist, 38);
	printf("index = %d.\n", index);
	int mainindex = mainsequential(MainList, index, 38);
	printf("mainindex = %d.\n", mainindex);
	return 0;
}

编译:gcc block.c

运行:./a.out

测试结果:

index = 2.

mainindex = 10.

分块查找(索引顺序表查找)

时间: 2024-08-08 15:05:07

分块查找(索引顺序表查找)的相关文章

分块查找\索引顺序查找

简介: 分块查找又称索引顺序查找,它是顺序查找的一种改进方法,性能优于顺序查找. 方法描述: 将n个数据元素"按块有序"划分为m块(一般块的长度均匀,最后一块可以不满)(m<=n),每一块中的节点不必有序,但块与块之间必须"按块有序":即第一块中的关键字必须小于(或者大于)第二块中的关键字,第二块中的关键字必须小于(或者大于)第三块中的关键字,构造索引表,索引表按关键字有序排列. 如下图所示: 图示为一个索引顺序表,其中包括三个块,第一个块的其实地址为0,快内

算法学习之查找算法:静态查找表(1)顺序表查找

引言: 对查找表一般的操作有:1.查询某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素. 静态查找表的操作只包括两种:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性: 静态查找表又有四种表现形式:顺序表的查找.有序表的查找.静态树的查找.索引顺序表的查找. 静态查找涉及的关键字类型和数据元素类型

查找[1]顺序表的查找

简单顺序查找,有序表的二分查找,索引顺序表的查找 1 #include "iostream" 2 #include "iomanip" 3 #include "time.h" 4 #include "stdlib.h" 5 using namespace std; 6 7 #define Max 20 8 9 /* 10 *简单顺序查找 11 */ 12 int Seq_Search(int A[],int n,int x)

顺序表查找和有序表查找

查找里面顺比表查找和有序表查找(包括二分查找,插值查找,斐波那契查找)比较简单,直接贴代码,代码里面有详细注释. 1 #include <iostream> 2 using namespace std; 3 4 //顺序表查找(线性查找.静态表查找) 时间复杂度为O(n) 5 int Seq_Search(int *s,int n,int key) 6 { 7 s[0] = key; //设置了一个哨兵,避免了每次比较一次过后都要判断查找位置是否越界 8 int i = n; 9 while

查找 - 顺序表查找

#include<cstdio> #include<cstring> #include<cstdlib> int Sequential_Search1(int *a,int n,int key){ int i; for(i=0;i<=n;i++){ if(a[i] == key) return i; } return 0; } int Sequential_Search2(int *a,int n,int key){ int i; a[0] = key; i =

顺序表查找及其优化(Java)

顺序表查找(线性查找): 1 private static void Ordersearch(int[] arr,int num) { 2 for (int i = 0; i < arr.length; i++) { 3 if (arr[i]==num) { 4 System.out.println(arr[i]); 5 return; 6 } 7 } 8 System.out.println("not found "); 9 10 } 优化方案:上面的方式每次循环都要判断i是否

顺序表查找算法及其优化

顺序查找算法实现如下: var arr = [5, 2, 4, 3, 1] , sequentialSearch = function(arr, val) { var i = 0 , len = arr.length; for ( ; i < len; i++) { // 比较一次 if (arr[i] === val) { // 比较二次 return i; } } return i; // 返回len,则说明查找失败 } 这里并不是足够完美, 因为每次循环时都需要对i是否越界, 即是否小于l

数据结构基础温故-6.查找(上):基本查找与树表查找

只要你打开电脑,就会涉及到查找技术.如炒股软件中查股票信息.硬盘文件中找照片.在光盘中搜DVD,甚至玩游戏时在内存中查找攻击力.魅力值等数据修改用来作弊等,都要涉及到查找.当然,在互联网上查找信息就更加是家常便饭.查找是计算机应用中最常用的操作之一,也是许多程序中最耗时的一部分,查找方法的优劣对于系统的运行效率影响极大.因此,本篇讨论一些查找方法. 一.顺序查找 1.1 基本思想 顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后

顺序表查找的优化

来源于书本,这个小技巧还是记录一下,其实它所表达的意思就是,for循环和while循环的一点微妙区别.在for循环中,比如: for(i=1;i<=n;i++) { if(a[i]==key) return i; } 比较.自增.加上边界的判定,一共需3步,而while循环,则只需要两步,减去了边界判定的一步. while(a[i]!=key) { i--; } int search(int a[],int n,int key) { int i; a[0]=key;/*设置a[0]为关键字值,称