zoukankan      html  css  js  c++  java
  • [数据结构]查找

    查找概念

    查找表:由同一类型的数据元素构成的集合。

    查找表按照操作的方式分为两大种:静态查找表和动态查找表。

    静态查找表:只作查找操作的查找表,它的主要的操作有:

    查找某个“特定的数据元素”

    动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。动态查找表的操作:

    查找时插入数据和查找时删除数据

    对于静态查找表来说,可以应用线性表结构来组织数据,这样可以使用顺序查找算法。如果再对主关键字排序,则可以应用折半查找等技术进行高效的查找。

    对于动态查找,则要考虑二叉排序树的查找技术。

    静态表查找

    顺序表查找

    顺序查找:从表中的第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,如果某个记录的关键字和给定值相等,则查找成功。如果直到最后一个(或第一个)记录,其关键字和给定值比较都不相等,则查找不成功。

    int Sequential_Search(int *a, int n, int key)
    {
    	int i;
    	for(i = 1; i <= n; i++)
    	{
    		if(a[i] == key)
    		{
    			return i;
    		}
    	}//for
    	
    	return 0;
    }
    

    但是这个算法是可以改进的,上面看到每向后移动一个元素后,都要比较当前的索引和数组的个数,防止越界。事实上,可以设置一个哨兵,这样就不需要每次让i与n作比较了。

    /*有哨兵的顺序查找,查找成功返回下标,不成功返回0*/
    int Sequential_Search2(int *a, int n, int key)
    {
    	int i = n;
    	a[0] = key;	//设置a[0]为关键字,称之为哨兵
    	
    	while(a[i] != key)
    	{
    		i--;
    	}
    	
    	return i;
    }
    

      这种在查找方向的尽头设置哨兵的方法,避免了在查找过程中每次比较后都要判断查找位置是否越界。在数据量较多时,效率提高很大,是非常好的编程技巧。

    折半查找

    有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功。若给定值小于中间记录,则在中间记录的左半区继续查找;若给定值大于中间记录,则在右半区查找。

  • 相关阅读:
    Java中List集合去除重复数据的六种方法
    常见的Redis面试"刁难"问题,值得一读
    以Integer类型传参值不变来理解Java值传参
    Linux系统安装snmp服务
    直接取数据到RANGE
    SAP翔子_2019集结号
    销售订单BOM组件分配(CP_BD_DIRECT_INPUT_PLAN_EXT)
    SAP翔子_webservice篇索引
    函数篇3 EXCEL导入函数去除行数限制
    ABAP基础篇4 常用的字符串操作语法
  • 原文地址:https://www.cnblogs.com/stemon/p/4477528.html
Copyright © 2011-2022 走看看