zoukankan      html  css  js  c++  java
  • 第八章:查找


    1.概念

     查找:

     查找方式:

     

    2.顺序表查找

    2.1.概念

    顺序查找(被查找的序列可以无序)

    线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败。

    由于顺序查找是从头插到尾,所以这种方法的查询时间慢。

    2.1.顺序表查找算法

     优化——引入哨兵

     2.3.举例

    图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8

    找到数组中存在数据8,返回位置。

    代码演示:

    import java.util.Scanner;
    /*
    
     * 顺序查找
    
     */
    public class SequelSearch {
      public static void main(String[] arg) {  
        int[] a={4,6,2,8,1,9,0,3};
        Scanner input=new Scanner(System.in);
        System.out.println("请输入你要查找的数:");
        //存放控制台输入的语句
      int num=input.nextInt();
      //调用searc()方法,将返回值保存在result中
        int result=search(a, num);
        if(result==-1){
           System.out.println("你输入的数不存在与数组中。");
        }
        else
           System.out.println("你输入的数字存在,在数组中的位置是第:"+(result+1)+"个");
    }
    
      //顺序排序算法
      public static int search(int[] a, int num) {        
        for(int i = 0; i < a.length; i++) {
            if(a[i] == num){//如果数据存在
                return i;//返回数据所在的下标,也就是位置
            }
        } 
        return -1;//不存在的话返回-1
     }
    }

    运行截图:

     3.有序表查找

    3.1.折半查找

     

    代码演示

    代码实现

    我以{1,2,3,4,5,6,6,6}这个数组作为被查询序列,下面代码使用情景为序列从小到大排序。

    public static List<Integer> binarySearch(int arr[], int left, int right, int findVal) {
    		int mid = (left + right) / 2;
    		int midVal = arr[mid];
    
    		if (left > right) {//left > right代表序列没有要找的元素
    			return new ArrayList<Integer>();
    		}
    
    		if (findVal > midVal) {// 查找元素大于中间值,向右递归
    			return binarySearch2(arr, mid + 1, right, findVal);
    		}
    
    		if (findVal < midVal) {//查找元素小于中间值,向左递归
    			return binarySearch2(arr, left, mid - 1, findVal);
    		}
    
    		else {//找到被查找元素
    			List<Integer> list = new ArrayList<Integer>();
    			int temp = mid - 1;//从查找元素的左边遍历查找是否还有相同元素
    
    			while (true) {
    				if (temp < 0 || arr[temp] != findVal) {//退出左边遍历查找条件
    					break;
    				}
    				list.add(temp);
    				temp -= 1;
    			}
    			list.add(mid);
    
    			temp = mid + 1;//从查找元素的右边遍历查找是否还有相同元素
    
    			while (true) {
    				if (temp > right || arr[temp] != findVal) {//退出右边遍历查找条件
    					break;
    				}
    				list.add(temp);
    				temp += 1;
    			}
    			return list;
    		}
    }

    3.2.插值查找

    其实就是插入法

    概念:

     原理:

    代码实现:

    public static void main(String[] args) {
    		int[] arr = { 1, 2, 3, 4, 5, 6, 6, 6, 6 };
    		List<Integer> list = insertValueSearch(arr, 0, arr.length - 1, 6);
    		System.out.println("index = " + list);
    
    }
    
    public static List<Integer> insertValueSearch(int arr[], int left, int right, int findVal) {
    		int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
    		int midVal = arr[mid];
    
    		if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
    			return new ArrayList<Integer>();
    		}
    
    		if (findVal > midVal) {
    			return insertValueSearch(arr, mid + 1, right, findVal);
    		}
    		if (findVal < midVal) {
    			return insertValueSearch(arr, left, mid - 1, findVal);
    		} else {
    			List<Integer> list = new ArrayList<Integer>();
    			int temp = mid - 1;
    			while (true) {
    				if (temp < 0 || arr[temp] != findVal) {
    					break;
    				}
    				list.add(temp);
    				temp -= 1;
    			}
    			list.add(mid);
    
    			temp = mid + 1;
    			while (true) {
    				if (temp > right || arr[temp] != findVal) {
    					break;
    				}
    				list.add(temp);
    				temp += 1;
    			}
    			return list;
    		}
    }  

    4.线性表索引

    4.1.概念

    4.2.稠密索引

     

    4.3.倒排索引

    参考资料:https://blog.csdn.net/weixin_44824500/article/details/104760260

  • 相关阅读:
    从win到多系统
    markdown编辑器抉择经历(做笔记多系统用户)
    最新的hosts
    Hosts 长期更新【已停】
    设备选型(选择交换机、选择路由器的技能指标)
    传输控制协议(TCP)
    数据的封装与解封装
    网络分类及OSI七层模型
    第一课 IP通信
    Twilio收发短信笔记
  • 原文地址:https://www.cnblogs.com/aaaazzzz/p/12932384.html
Copyright © 2011-2022 走看看