数据结构之--插值查找

数据结构之--插值查找

定义:插值查找就是把要查找的关键字key与查找表中最大和最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式(key-a[low])/(a[high]-a[low])

图解

时间复杂度:只是把折半的算法由mid=(low+high)/2变为了(mid=low+(high-low)*(key-a[low])/(a[high]-a[low])),所以时间复杂度还是为与普通折半查找一样为:O(logn)。

#include<stdio.h>

int Binary_Search(int *a,int n,int key){

  int low,mid,high;

  low = 1;                                  /*定义最低下表为记录首位*/

  high = n;                                   /*定义最高下表为记录末位*/

  while(low<high){

    mid=low+(key-a[low])*(high-low)/(a[high]-a[low]);           /*折半*/

    if(a[mid]<key)                              /*若查找值比中值小*/

      low=mid+1;                            /*最高下标调整到中位下标小一位*/

    else if(a[mid]>key)                             /*若查找值比中值大*/

      high=mid-1;                            /*最低下标调整到中值位下标大一位*/

    else

      return mid;                              /*若相等说明mid即为查找到的位置*/

  }

  return 0;

}

void main(){

  int num[] = {0,1,26,24,35,47,59,62,73,88,99};

  int result = Binary_Search(num,sizeof(num)/sizeof(num[0]),62);

  printf("查找结果为:%d\n",result);

}

运行结果为:

时间: 2024-09-29 07:25:10

数据结构之--插值查找的相关文章

数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找.本篇博客会给出相应查找算法的示意图以及相关代码,并且给出相应的测试用例.当然本篇博客依然会使用面向对象语言Swift来实现相应的Demo,并且会在github上进行相关Demo的分享. 查找在生活中是比较常见的,本篇博客所涉及的这几种查找都是基于线性结构的查找.也就是说我们的查找表是一个线性表,我

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

9.18 内存区域 全局变量 线程 插值查找 位域 栈的实现

栈区可以修改默认大小配置: 栈区默认的大小是1M,在vs2013中可以修改. 堆区和栈区的地址区别: 栈是连续的,向上增长,地址越来越小.类似数组. 堆是链接的,向下增长,地址越来越大.类似链表. 栈区   高地址到低地址 堆区   低地址到高地址 #include <stdio.h> #include <stdlib.h> int main() { int a = 1, b = 2; printf("%p,%p\n", &a, &b); //a

数据结构:静态查找表

数据结构:静态查找表(C语言版) 1.写在前面 ?从查找说起: 在英汉字典中查找某个英文单词的中文解释:在新华字典中查找某个汉字的读音.含义:在对数表.平方根表中查找某个数的对数.平方根:邮递员送信件要按收件人的地址确定位置等等. 从计算机.计算机网络中查找特定的信息,就需要在计算机中存储包含该特定信息的表.查找是许多程序中最消耗时间的一部分.因而,一个好的查找方法会大大提高运行速度. ?先讨论静态查找表: 静态查找表应该是查找中最为简单的.仅仅是在固定的表中对元素的查找,而不涉及修改表中的元素

数据结构复习之查找算法的总结回顾

一.查找的基本概念 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录). 查找表(Search Table)是同一类型的数据元素(或记录)构成的集合. 查找表按照操作方式分为两大类: 静态查找表:只作查找操作的查找表. 顺序表查找.有序表查找.线性索引查找 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个元素. 二叉排序树.平衡二叉树(AVL树).多路查找树(B树) 二.顺序表查询 这是最简单的一种,

二分查找法以及拉格朗日插值查找法

不管是二分查找法还是拉格朗日法,必须先排序,否则无法使用. 插值查找发速度比二分查找法要快 插值查找法,数据均匀是1次找到,不均匀是多次,即使这样这样它也是快于二分的. 那个1.0挺重要的一个技巧,将那个比例变成实数. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib.h> #define N 1024 void search(int a[N],int num) { int tou = 0; int

数据结构之二叉树查找

数据结构之--二叉树查找 定义:它是一棵树,或者具有以下性质的树.  若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值:  它的左.右子树也分别为二叉排序树: 图解: ?        ?    ?    ?    ?    ?? #include<stdio.h> #include<stdlib.h> typedef int Status; #define TRUE 1 #define FALSE 0 t

SDUT 3376 数据结构实验之查找四:二分查找

数据结构实验之查找四:二分查找 Time Limit: 20MS Memory Limit: 65536KB Submit Statistic Problem Description 在一个给定的无重复元素的递增序列里,查找与给定关键字相同的元素,若存在则输出找到的位置,不存在输出-1. Input 一组输入数据,输入数据第一行首先输入两个正整数n ( n < = 10^6 )和m ( m < = 10^4 ),n是数组中数据元素个数,随后连续输入n个正整数,输入的数据保证数列递增.随后m行输

c数据结构的字符串查找的Brute-Force算法

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,