分块查找算法的实现。在数组{90,43,15,32,78,9,66,49,35,71,22,86,18,53}中查找关键字为35的码--简单

源程序:

// 32 66 90
//15,32,9,22,18 43,66,49,35,53 90,78,71,86

//分析:分块查找由索引查找和子表查找两步完成。设n个数据元素的查找表分为m个子表,且每个子表
//均为t个元素,则t=n/m 。这样,分块查找的平均查找长度为:
// ASL=ASL索引表+ASL子表=1/2(m+1)=1/2(m+n/m)+1
//可见,平均查找长度不仅和表的总长度n有关,而且和所分的子表的个数m有关。

#include <stdio.h>

#define LEN 15
typedef struct
{
  int key,low;
}index;

int block_search(int *a,index *inx,int k,int bn)
{
  int low1=0,i,mid,high;
  int high1=bn-1;
  int find=0;
  while((low1<=high1) && !find) //在索引表中查找k所在的块
  {
    mid=(low1+high1)/2;
    if(k<inx[mid].key)
      high1=mid-1;
    else if(k>inx[mid].key)
      low1=mid+1;
    else
    {
      high1=mid-1;
      find=1;
    }
  }
  if(low1<bn)
  {
    i=inx[low1].low;
    high=i+LEN/bn;
  }
  while(i<high && a[i]!=k)
    i++;                    //在块中进行查找
  if(a[i]!=k)
    i=-1;
  return i;
}

void main()
{
  int a[15]={90,43,15,32,78,9,66,49,35,71,22,86,18,53};
  index b[3]={32,1,66,6,90,11};
  int key,bn,result;
  printf("数据a是:");
  printf("90,43,15,32,78,9,66,49,35,71,22,86,18,53\n");
  key=35;
  bn=3;
  printf("key=%d\n",key);
  result=block_search(a,b,key,bn); //查找k
  if(result!=-1)
    printf("查找成功!该数位置是:%d\n",result+1);
  else
    printf("查找失败!\n");
}

运行结果:

原文地址:https://www.cnblogs.com/duanqibo/p/11904267.html

时间: 2024-10-28 20:40:17

分块查找算法的实现。在数组{90,43,15,32,78,9,66,49,35,71,22,86,18,53}中查找关键字为35的码--简单的相关文章

基于数组二分查找算法的实现

基于数组二分查找算法的实现 二分查找 查找 算法 赵振江 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功

通用固定长度编码格式的字符串查找算法的实现

通用固定长度编码格式的字符串查找算法的实现 字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE.DB2.SYBASE.MS SQL SERVER.MYSQL等等)也都提供了对应的字符串处理函数,比如DB2的LOCATE函数. 但在实际的工作中,还是会遇到一些特殊情况的处理,这使得直接使用字符串查找函数,得到的结果可能是错误的,比如本文中提到的固定长度编码格式的字符串的查找.值得注意的是,本文提出的算法可以稍加修改即移植到其它关系数据库系统或者前端开发工具中. 在实际数据库

查找算法的实现(C/C++实现)

存档: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define max 20 4 typedef int keytype; 5 #include "search.h" 6 int main() 7 { 8 sstable st; 9 keytype key; 10 int result,num; 11 init(st); 12 printf("******************************

单链表上查找算法的实现(0955) swust-oj

Description 建立一个长度为n的带头结点的单链表,在该表中寻找第i个结点,若找到,则输出“OK!”,否则输出“error!”.处理数据类型为整型. input 第一行为链表的长度n: 第二行为链表中的数据元素: 第三行为要找的结点i. Output 找到就输出“OK!”,没找到就输出“error!”. Sample Input 10 1 2 3 4 5 6 7 8 9 10 5 Sample Input OK! 代码:#include<stdio.h>#include<mall

数组正负元素前后移动算法的实现(以0为分界线)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

RMQ问题总结,标准RMQ算法的实现

RMQ问题:对于长度为N的序列,询问区间[L,R]中的最值 RMQ问题的几种解法: 普通遍历查询,O(1)-O(N) 线段树,O(N)-O(logN) DP,O(NlogN)-O(1) RMQ标准算法,O(N)-O(1) 简单介绍: 朴素的查询,不需要任何预处理,但结果是没有任何已知的信息可以利用,每次都需要从头遍历到尾. 线段树,区间问题的神器,用线段树做比起朴素的暴力查询要快得多,关键在于线段树使用了分治思想,利用了区间问题的可合并性.任何一个区间最多只需要logN个线段树上的区间来合并,线

KMP算法和next数组的c/c++实现

KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看不懂,直接拿来用也是各种问题),这里的代码封装性和优化都有待考究,但是基本能实现KMP算法 http://www.cnblogs.com/c-cloud/p/3224788.html 这里提醒各位看官,while循环次数不是常见的固定次数的循环,而是动态根据实际情况将大家固认为的“一趟循环”分解成几

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不能看几遍就理解理论中的奥妙,只能在别人大谈XX理论XX算法的时候,自己一个人苦逼的面对错误的程序问为什么... 下面开始动手来实现一下简单的Bug2避障算法.由于算法中涉及到机器人与外界环境的交互,因此需要选择一个仿真软件.常用的移动机器人仿真软件主要有Gazebo.V-rep.Webots.MRD