精华内容
下载资源
问答
  • 主要介绍了PHP有序表查找之二查找(折半查找)算法,简单介绍了二查找法的概念、原理并结合实例形式分析了php基于二查找算法进行有序线性表查找的相关操作技巧,需要的朋友可以参考下
  • 顺序有序表进行分查找

    千次阅读 2020-10-25 20:33:53
    设置low在有序表最左边,high在最右边,mid为(low+high)/2;取中间位置, 当mid的值等于k,返回第mid+1个(从0开始) 当mid的值大于k,从mid左边开始找,令high=mid-1; 当mid的值小于k,从mid右边开始找,令low=mid+...

    设置low在有序表最左边,high在最右边,mid为(low+high)/2;取中间位置,

    当mid的值等于k,返回第mid+1个(从0开始)

    当mid的值大于k,从mid左边开始找,令high=mid-1;

    当mid的值小于k,从mid右边开始找,令low=mid+1;

     

    struct record (int key;int others;);

    int blsearch(struct record r[],int k)

    {

    int low =0,mid,high=n-1;

    while(low<=high)

    {

    mid=(low+high)/2;

    if(r[mid].key==k) return mid+1;

    else if(r[mid].key>k) high=mid-1;

    else low=mid+1;

    }

    return 0;

     

    }

    展开全文
  • 分查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,二分查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。 ...

    二分查找

          二分查找也称为是折半查找,属于有序查找算法。元素必须是有序的,如果是无序的则要先进行排序操作。二分查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,二分查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。

    原理:

           二分查找用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

    算法详细描述:

    • 选择一个可以将列表arr大致一份为二的索引i;
    • 检查是否有arr[i] == target;
    • 如果不是,检查arr[i]大于还是小于target;
    • 根据上一步的结果,确定在arr的左半部分还是右半部分搜索target。

    代码实现:

    ## 递归版本
    def binarySearch(arr, target):
        """
        假设arr是列表,其中元素按升序排列.
        如果target是arr中的元素,则返回True,否则返回False
        """
    
        def bSearch(arr, target, low, high):
            if high == low:
                return arr[low] == target
            mid = (low + high) // 2
            if arr[mid] == target:
                return True
            elif arr[mid] > target:
                if low == mid:
                    return False
                else:
                    return bSearch(arr, target, low, mid - 1)
            else:
                return bSearch(arr, target, mid + 1, high)
    
        if len(arr) == 0:
            return False
        else:
            return bSearch(arr, target, 0, len(arr) - 1)
    
    ## 非递归版本
    def binarySearch(arr, target):
        low = 0
        high = len(arr) - 1
        while low < high:
            mid = (low + high) // 2
            if target < arr[mid]:
                high = mid - 1
            elif target > arr[mid]:
                low = mid + 1
            else:
                return True
        return False
    

    时间复杂度:

           假设,总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。由于n/2^k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)

     

    展开全文
  • 这次更新数据结构查找的部分,...对有序顺序(7,12,15,18,27,32,46,65,83)用二分查找,若查找成功,则查找所需比较次数最多的键值是? 解读: 刚开始看到这道题时,完全懵,说了个啥玩意。仔细研究发现...

    这次更新数据结构查找的部分,先上一个查找的思维导图,有一个宏观认识

    今天要分享的主题就是导图中用红框括起来的地方,二分查找的题用二叉树去解决,这个来源于最近做数据结构自考题,把这个题先写出来

    题目:

    对有序顺序表(7,12,15,18,27,32,46,65,83)用二分查找,若查找成功,则查找所需比较次数最多的键值是?

    解读:

    刚开始看到这道题时,完全懵,说了个啥玩意。仔细研究发现,题描述的意思是,在这个顺序表中找到一个其中值,经过中间值对比次数最多的值是多少

    解题思路:

    我们知道在书本上,应用二分查找是通过low high两个指针对应的键值找出中间值,让这个中间值与要找的值对比,直到找到位置,这就需要将整个顺序表所有数据找一遍,很麻烦,有没有简单方法,有的!是什么?

    将二分查找用二叉排序树实现,比如将题中的顺序表写成二叉排序树的形式

    而27,12,46取得便是二分查找中mid得值

    从图中可以直观的看出,找到18,83的路径最长,即经过的比较次数最多,因此18,83就是答案

    举一反三:

    当将二分查找转化为二叉排序树时,就可以不用二分查找的平均查找公式(关键带log运算费事)

    用二叉排序树的平均查找长度公式时,假设查找概率相等

    则ASL=(1+2*2+2*3+2*4)/9=19/9

    参考博客

    展开全文
  • Java有序表查找:折半查找、二查找、差值查找和斐波那契查找  【尊重原创,转载请注明出处】http://write.blog.csdn.net/postedit?ticket=ST-84189-RPiSkdLK6Dt1Oyqsgvsx-passport.csdn.net  目前查找方法...

    Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

        【尊重 原创,转载请注明出处 】http://blog.csdn.net/guyuealian/article/details/51106238
         目前查找方法主要:顺序查找、有序查找(分为:折半查找即二分查找、差值查找和斐波那契查找方法)、线性索引查找、二叉排序树、平衡二叉树(AVL树)以及多路查找树(B树)、散列表查找(哈希表)等查找方法
         【1】顺序查找:是最简单的查找方法,其时间复杂度为O(n),是通过 构造一个线性表,采用遍历的方法,将记录与关键字一个一个的对比,若相等则查找成功,若全都不相等,则查找失败即记录不存在;
         【2】有序查找顺序表的记录一般是无序,而有序表的记录是有序的;使用有序表查找方法时,前提条件是待查找的记录必须是已经排好序的。 有序查找分为:折半查找即二分查找、差值查找和斐波那契查找方法
          (1)
    折半查找法:又称二分查找,是 最经典的有序表查找,它的前提是线性表中的记录必须是有序的(通常从小到大排列),线性表采用顺序存储的方式; 其基本思路是:将关键字key与中间记录((low+high)/2)进行比较;若相等,则查找成功;若关键字小于中间记录,则说明关键字可能在下半区;若大于,则说明关键字可能在上半区;不断重复上述过程,直到查找成功或失败;
           Java代码如下:
    package javatest1;
    public class JavaTest1 {
    	public static void main(String[] args) {
    		int[] num = { 1, 2, 3, 4, 5, 6 };//必须有序
    		int index = Binary_Search(num, 5);
    		System.out.print(index);
    	}
    	/* num:有序表(由小到大排列)
    	 * key:要查找的关键字
    	 * return:还回查找到关键字的下标,没有找到则还回-1
    	 */
    	private static int Binary_Search(int[] num, int key) {
    		int low, high, mid;
    		low = 0;
    		high = num.length - 1;
    		while (low <= high) {
    			mid = (low + high) / 2;
    			if (key < num[mid])
    				high = mid - 1;
    			else if (key > num[mid])
    				low = mid + 1;
    			else// 如果等于则直接还回下标值
    				return mid;
    		}
    		return -1;
    	}
    }
          (2)插值查找:对二分法查找进行改进,将要查找的关键字key与查找表中的最大最小值记录进行比较后,再确定查找的范围。在二分法查找中,是以中间记录作为查找分区的,即将表一分为二,分为上下两个查找分区:
          而插值查找采用插值公式的方法,来确定查找分区。可简单这样理解,比如有100个数其值在0~1000范围之间从小到大排序,你要查找关键字为5的位置下标,若采用二分法,则大概在500的地方往下查找,但采用插值的方法,可以通过插值计算出5这个关键字应该在靠近0的地方,因此查找时从50往下开始查找,从而提高效率:


          因此插值查找只需要在折半查找算法的代码中简单修改一下即可:
    package javatest1;
    public class JavaTest1 {
    
    	public static void main(String[] args) {
    		int[] num = { 1, 2, 3, 4, 5, 6 };// 必须有序
    		int index = Insert_Search(num, 5);
    		System.out.print(index);
    	}
    	/*
    	 * num:有序表(由小到大排列) key:要查找的关键字 return:还回查找到关键字的下标,没有找到则还回-1
    	 */
    	private static int Insert_Search(int[] num, int key) {
    		int low, high, mid;
    		low = 0;
    		high = num.length - 1;
    		while (low <= high) {
    			// mid = (low + high) / 2;//二分查找
    			mid = low + (high - low) * (key - num[low])/ (num[high] - num[low]); // 插值查找
    			if (key < num[mid])
    				high = mid - 1;
    			else if (key > num[mid])
    				low = mid + 1;
    			else
    				// 如果等于则直接还回下标值
    				return mid;
    		}
    		return -1;
    	}
    }
    


    展开全文
  • 三种有序表查找算法

    千次阅读 2019-08-26 11:52:06
    三种有序表查找及其心得体会有序表查找算法简介排序算法种类二查找算法时间复杂度插值查找算法时间复杂度斐波那契查找算法时间复杂度总结参考文献 有序表查找算法简介 查找的是一个有序线性表,并进行查找操作的...
  • 主要介绍了PHP有序表查找之插值查找算法,简单分析了插值查找算法的概念、原理并结合实例形式分析了php实现针对有序表插值查找的相关操作技巧,需要的朋友可以参考下
  • 有序表的二分查找

    千次阅读 2017-04-23 10:06:06
    经典算法——有序表的二分查找
  • 有序表查找——折半查找分析

    千次阅读 2020-06-03 21:31:59
    分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用数组向量作为表的存储结构,不能使用链表,不妨设有序表是递增有序的。 2、二分查找的基本思想 二分查找的基本思想是:(设R[low…high]是当前的...
  • //请写出对有序表进行折半查找的非递归算法,并将对应的程序调试运行通过 #include #include #define N 100 typedef int Status; typedef int ElemType;typedef struct {//创建有序表 ElemType *list; int length;...
  • 有序表查找---折半查找算法

    万次阅读 2019-03-10 20:00:31
    折半查找的基本思想是:在有序表中,取中间值为比较对象,如果给定的值和中间值的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间值的关键字,则在中间...
  • 在154个元素组成有序表进行二分法查找,可能的比较次数为() A:10 B:8 C:4 D:2答案:BCD别出新意的解题思路: 折半查找过程可用二叉树来描述,把有序表中间位置上的结点作为树的根结点,左子表和右子表...
  • 有序表的顺序查找分析

    千次阅读 多人点赞 2016-10-24 15:41:24
    一般线性表的顺序查找有序表的二分查找,基于索引的分块查找等都是有独特特征的查找方式,但是有一种查找夹在一般线性表和有序下的二分查找中间,很容易被忽视,因此提出来单独讨论。这个查找就是:有序表的顺序...
  • 符号符号是一种存储键值的数据结构,支持两种操作:插入(put)和查找(get)。 可以分为无序符号有序符号。本节的实现基于 每个键只对应着一个值,不允许存在重复的键 向中存入新的键值和已...
  • 有序表上的查找(二分查找法)

    千次阅读 2017-06-08 16:48:53
    /*有序表上的查找(二分查找法)*/ #include #define Maxsize 10 typedef int KeyType; typedef struct { int elem[Maxsize]; int n; /*最后一个数据元素的下标*/ }SqTable; void Create(SqTable *st) { int
  • 静态查找表。实现有序表的折半查找算法 静态查找表。实现有序表的折半查找算法 静态查找表。实现有序表的折半查找算法静态查找表。实现有序表的折半查找算法
  • 有序表查找算法总结

    千次阅读 2018-01-17 20:22:31
    有序表:按一定顺序排列的表。  1、折半查找:又称二分查找,直接上代码、 public int BinarySerch(int[] a,key){ int low=1,high=a.length,mid; while( low ){ mid = low + (high - low) / 2; if( key [mid]){...
  • 分查找有序顺序

    千次阅读 2017-01-21 11:33:27
    顺序应用6:有序顺序查询 Time Limit: 7MS Memory Limit: 700KBProblem Description 顺序内按照由小到大的次序存放着n个互不相同的整数(1),任意输入一个整数,判断该整数在顺序中是否存在。如果在顺序...
  • 顺序表查找有序表查找 顺序表进行查找 索引顺序查找表 索引顺序查找表也就是分块查找 把线性表分为若干块,每一块的关键字都小于下一块的最小关键字。 索引按顺序排列进行查找,在找到的块进行顺序查找
  • 顺序表和有序表查找顺序查找定义:从线性表中的第一个(或最后一个)数据元素开始,逐个进行数据元素关键字和给定值的比较,若某个数据元素的关键字和给定值相等则查找成功;如果直到最后一个(或第一个)数据元素,...
  • 有序表查找——折半查找

    千次阅读 2017-05-08 11:01:03
    折半查找也称(二分查找) 前提:线性表中的记录必须是关键码有序(通常从小到大),线性表必须采用顺序存储。 思想:取中间记录作为比较对象 , 若给定值与中间记录的关键字相等,则成功;若小于,则在中间记录...
  • 顺序表查找:顺序查找,哨兵查找 有序表查找:折半查找,插值查找,斐波那契查找
  • 查找技术相关总结: ...2.有序表对分查找:条件:顺序存储的有序表。 3.分块查找(又称索引顺序查找):分块有序表结构分为两部分(1)线性表本身采用顺序存储结构(2)在建立一个索引表,在索引表中,线性
  • 有序表——折半查找

    千次阅读 2017-11-12 18:44:25
    分查找又称折半查找,前提要求数据序列呈现线性结构,即必须是经过排序的。 基本思路:  在一组有序序列中,取中间值与给定关键字进行比较,如果给定关键字大于该值关键字,则要查找的关键字位于有序序列的后半...
  • 查找8.2 顺序表8.2.1 顺序表的查找基本思想顺序存储结构下的顺序查找算法平均查找长度8.2.2 有序表的折半查找折半查找的算法思想折半查找算法一般代码二叉搜索树 8.2 顺序表 采用顺序存储结构的数据表称为顺序表。...
  • 有序表查找-折半查找

    千次阅读 2019-04-11 16:46:12
    low,high 分别为待查找范围的上界和下界,指针mid指示区域的中间位置,折半查找的范围其实就是用mid不断更新low或者high的位置,直到找到目标值,注意查找之前需要确保有序的 mid=(low+high)/2 设目标值为...
  • int Recurrence_Search_Bin(SSTable ST,... //用递归方法在有序表ST中二分查找关键字为key的数据元素,若找到则返回该元素在表中的位置,否则返回0 if(floor > roof) return 0; int mid = (floor + roof) / 2; if(k
  • 有序顺序查询(二分查找

    千次阅读 2017-08-09 08:28:29
    Problem Description 顺序内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序中是否存在。...第二行依次输入n个各不相同的有序非负整数,代表表里的元素; 第三行输入整数t
  • 有序表的折半查找

    千次阅读 2018-07-07 01:40:09
    有序表的折半查找 #include &lt;iostream&gt; using namespace std; typedef struct { int r[100]; int length; }table; int create(table &amp;t) { int a; t.length=0; cin&gt;&gt;a;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,769
精华内容 67,507
关键字:

对有序表进行对分查找