(转载)查找一 线性表的查找

查找一 线性表的查找

目录

查找的基本概念



什么是查找?

查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素。

查找算法的分类

若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表

否则,称之为静态查找表

此外,如果查找的全过程都在内存中进行,称之为内查找

反之,如果查找过程中需要访问外存,称之为外查找

查找算法性能比较的标准

——平均查找长度ASL(Average Search Length)

由于查找算法的主要运算是关键字的比较过程,所以通常把查找过程中对关键字需要执行的平均比较长度(也称为平均比较次数)作为衡量一个查找算法效率优劣的比较标准。

选取查找算法的因素

(1) 使用什么数据存储结构(如线性表、树形表等)。

(2) 表中的次序,即对无序表还是有序表进行查找。

顺序查找


要点

它是一种最简单的查找算法,效率也很低下。

存储结构

没有存储结构要求,可以无序,也可以有序。

基本思想

从数据结构线形表的一端开始,顺序扫描依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;

若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

核心代码

public int orderSearch(int[] list, int length, int key) {
    // 从前往后扫描list数组,如果有元素的值与key相等,直接返回其位置
    for (int i = 0; i < length; i++) {
        if (key == list[i]) {
            return i;
        }
    }
    
    // 如果扫描完,说明没有元素的值匹配key,返回-1,表示查找失败
    return -1;
}

算法分析

顺序查找算法最好的情况是,第一个记录即匹配关键字,则需要比较 1 次;

最坏的情况是,最后一个记录匹配关键字,则需要比较 N 次。

所以,顺序查找算法的平均查找长度为

ASL = (N + N-1 + ... + 2 + 1) / N = (N+1) / 2

顺序查找的平均时间复杂度O(N)

二分查找


要点

二分查找又称折半查找,它是一种效率较高的查找方法。

存储结构

使用二分查找需要两个前提:

(1) 必须是顺序存储结构。

(2) 必须是有序的表。

基本思想

首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;

否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

核心代码

public class BlockSearch {

    class IndexType {
        public int key; // 分块中的最大值
        public int link; // 分块的起始位置
    }

    // 建立索引方法,n 是线性表最大长度,gap是分块的最大长度
    public IndexType[] createIndex(int[] list, int n, int gap) {
        int i = 0, j = 0, max = 0;
        int num = n / gap;
        IndexType[] idxGroup = new IndexType[num]; // 根据步长数分配索引数组大小

        while (i < num) {
            j = 0;
            idxGroup[i] = new IndexType();
            idxGroup[i].link = gap * i; // 确定当前索引组的第一个元素位置
            max = list[gap * i]; // 每次假设当前组的第一个数为最大值
            // 遍历这个分块,找到最大值
            while (j < gap) {
                if (max < list[gap * i + j]) {
                    max = list[gap * i + j];
                }
                j++;
            }
            idxGroup[i].key = max;
            i++;
        }

        return idxGroup;
    }

    // 分块查找算法
    public int blockSearch(IndexType[] idxGroup, int m, int[] list, int n, int key) {
        int mid = 0;
        int low = 0;
        int high = m -1;
        int gap = n / m; // 分块大小等于线性表长度除以组数

        // 先在索引表中进行二分查找,找到的位置存放在 low 中
        while (low <= high) {
            mid = (low + high) / 2;
            if (idxGroup[mid].key >= key) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }

        // 在索引表中查找成功后,再在线性表的指定块中进行顺序查找
        if (low < m) {
            for (int i = idxGroup[low].link; i < idxGroup[low].link + gap; i++) {
                if (list[i] == key)
                    return i;
            }
        }

        return -1;
    }

    // 打印完整序列
    public void printAll(int[] list) {
        for (int value : list) {
            System.out.print(value + " ");
        }
        System.out.println();
    }

    // 打印索引表
    public void printIDX(IndexType[] list) {
        System.out.println("构造索引表如下:");
        for (IndexType elem : list) {
            System.out.format("key = %d, link = %d\n", elem.key, elem.link);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int key = 85;
        int array[] = { 8, 14, 6, 9, 10, 22, 34, 18, 19, 31, 40, 38, 54, 66, 46, 71, 78, 68, 80, 85 };
        BlockSearch search = new BlockSearch();

        System.out.print("线性表: ");
        search.printAll(array);

        IndexType[] idxGroup = search.createIndex(array, array.length, 5);
        search.printIDX(idxGroup);
        int pos = search.blockSearch(idxGroup, idxGroup.length, array,
                array.length, key);
        if (-1 == pos) {
            System.out.format("查找key = %d失败", key);
        } else {
            System.out.format("查找key = %d成功,位置为%d", key, pos);
        }
    }

}

分块查找之JAVA实现

  

运行结果

线性表: 8 14 6 9 10 22 34 18 19 31 40 38 54 66 46 71 78 68 80 85 
构造索引表如下:
key = 14, link = 0
key = 34, link = 5
key = 66, link = 10
key = 85, link = 15

查找key = 85成功,位置为19

算法分析

因为分块查找实际上是两次查找过程之和。若以二分查找来确定块,显然它的查找效率介于顺序查找和二分查找之间。

三种线性查找的PK


(1) 以平均查找长度而言,二分查找 > 分块查找 > 顺序查找。

(2) 从适用性而言,顺序查找无限制条件,二分查找仅适用于有序表,分块查找要求“分块有序”。

(3) 从存储结构而言,顺序查找和分块查找既可用于顺序表也可用于链表;而二分查找只适用于顺序表。

(4) 分块查找综合了顺序查找和二分查找的优点,既可以较为快速,也能使用动态变化的要求。

时间: 2024-08-05 07:08:28

(转载)查找一 线性表的查找的相关文章

查找一 线性表的查找

查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 ——平均查找长度ASL(Average Search Length) 由于查找算法的主要运算是关键字的比较过程,所以通常把查找过程中对关键字需

线性表的查找

查找基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作. 线性表的查找 在查找表中.线性表查找是最简单的一种,基本的操作为顺序查找和折半查找. 顺序查找:从表的一端開始.依次将查找的keyword与给定数据库进行批对,若keyword在给定数据库中存在.则查找成功.否则当数据库从头到尾没有批对到.则查找失败. 作用范围:即使用线性表的顺序存储又适合于线性表的链式存储结构. 数据元素类型定义 typedef struct{ KeyType key. //keywor

转:线性表的查找-二分查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.2.1.htm 二分查找 1.二分查找(Binary Search)     二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构.不妨设有序表是递增有序的. 2.二分查找的基本思想    二分查找的基本思想是:(设R[low..high]是当前的查找区间) 

转:线性表的查找-顺序查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.1.htm 顺序查找(Sequential Search)     在表的组织方式中,线性表是最简单的一种.顺序查找是一种最简单的查找方法. 1.顺序查找的基本思想    基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较.若当前扫描到的结点关键字与K相等,则查找成功:若扫描结束后,仍未找到关键字等于K的结点,则

转:线性表的查找-分块查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.3.htm 分块查找    分块查找(Blocking Search)又称索引顺序查找.它是一种性能介于顺序查找和二分查找之间的查找方法. 1. 二分查找表存储结构    二分查找表由"分块有序"的线性表和索引表组成. (1)"分块有序"的线性表    表R[1..n]均分为b块,前b-1块中结点个数为 ,第b块的结

[Data Structure &amp; Algorithm] 线性表的查找

平均查找长度 ASL 影响查找算法好坏的主要标准 - 时间复杂度,通常用 - 平均查找长度 定义 - 为确定记录在查找表中的位置,需要和给定值进行比较的关键字的个数的期望 公式 - ASL = (查找成功时 + 查找失败时)的平均查找长度的期望 基本概念 Ps - 查找成功时的概率 Pf - 查找失败时的概率 Pi - 需要比较I次才能确定位置的记录出现的概率 n - 查找表的长度 好的算法 可以改变 - Pi 对于越小的i对应的Pi越大越好 不可以改变 - Ps和Pf 线性表上的查找 顺序表

查找算法--线性结构的查找方法

查找基本概念: 查找又称为检索,指从一批记录中找出满足指定条件的某一记录过程.在日常生活中比如通讯录查找,字典查找等经常使用查找方法:在程序设计中,查找在许多程序中需要占用很多时间,因此,一个好的查找方法可以提高程序的运行速度. 主关键字和次关键字: 在需要查找的数据结构中,每条记录一般包含多个数据域.查找条件一般是给定其中的一个或几个域的值,这些作为查找条件的域成为关键字(KEY),如果关键字可以唯一标示数据结构中的一条记录,则称此关键字(Primary Key):若关键字不能唯一区别各个不同

查找[1]顺序表的查找

简单顺序查找,有序表的二分查找,索引顺序表的查找 1 #include "iostream" 2 #include "iomanip" 3 #include "time.h" 4 #include "stdlib.h" 5 using namespace std; 6 7 #define Max 20 8 9 /* 10 *简单顺序查找 11 */ 12 int Seq_Search(int A[],int n,int x)

wust oj 1635 线性表的删除查找增添

输入数据只有一组,有很多行.每行的格式可能是下列一种: insert a name delete name show search name 其中:a 是一个整数(≥1),name是一个姓名(由长度不超过20的英文字母组成). insert a name表示在第a个名字前插入名字name,如果a>线性表的长度,则表示在尾部插入. delete name表示删除姓名name的所有结点,线性表中允许同名情况出现. show列出线性表中所有姓名,如果表为空,则输出"0" search