查找——查找的基本概念,线性表之顺序查找

本篇文章主要介绍数据结构中查找的基本概念,线性表的顺序查找算法,其中的代码全部使用c语言,如有错误希望大家多多指出。

目录

一,查找的基本概念

二,线性表的查找

        1.顺序查找

        01 基本内容

 02 性能分析


一,查找的基本概念

问题:在哪里找?
查找表: 由同一类型的数据元素(或记录)构成的 集合 。由于集合中 的数据元素之间存在着 松散的关系 ,因此查找表是 种应用灵便的结构。
问题:什么查找?
——根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)
关键字   用来标识一个数据元素(或记录)的某个数据项的值
•               主关键字    可唯一地标识一个记录的关键字是主关键字

                       次关键字    反之,用以识别若干记录的关键字是次关键字 

问题:查找成功否?
查找——根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)
若查找表中存在这样一个记录,则称“ 查找成功 ”。
        •  查找结果给出整个记录的 信息 ,或指示该记录在查找表中的 位置 ;
否则称“ 查找不成功 ”。
        •  查找结果给出“ 空记录 ”或“ 空指针 ”。
问题:查找目的是什么?
对查找表经常进行的操作:
1、 查询 某个“特定的”数据元素是否在查找表中;
2、 检索 某个“特定的”数据元素的各种属性;
3、在查找表中 插入 一个数据元素。
4、 删除 查找表中的某个数据元素。
问题:查找表怎么分类?
查找表可分为两类:
        • 静态查找表:
•         仅作查询(检索)操作的查找表。
动态查找表
        作“插入”和“删除”操作的查找表
 • 问题:如何评价查找算法?
  查找算法的评价指标:                                                                                               
  关键字的平均比较次数 ,也称 平均查找长度 ASL (Average Search Length)

二,线性表的查找

1.顺序查找 

01 基本内容

         应用范围:

        顺序表或线性链表表示的静态查找表

        表内元素之间无序

        顺序表的表示:

typedef struct 
{
     ElemType   *R; //表基址
     int          length;     //表长
}SSTable;

 在顺序表ST中查找值为key的数据元素

 从头开始通过for循环遍历比较,如果key值相同返回位置信息 

下面这种是从最后一个下标位置开始比较,for循环执行条件是查找的key值与线性表中某个位置key值不同,当相同时结束循环,则此时的下标位置就是要查找数据的位置;如果下标小于等于0则直接跳出循环,说明要找的数据不存在于线性表中。

下面这个相较于上面更一步简化算法,在for的条件里直接加入下标必须>0,此时若key值相同直接返回下标i的值。 

但我们会发现上面的算法每执行一次循环,都要进行两次比较,是否能改进?

改进:把待查关键字key存入表头(“哨兵”),从后向前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。

int Search_Seq( SSTable  ST , KeyType  key )
{//若成功返回其位置信息,否则返回0
  ST.R[0].key =key;   
 for( i=ST.length; ST.R[ i ].key!=key;  - - i  );
  return i; 
}

下面是一段完整的顺序查找实例:

#include <stdio.h>

// 顺序查找函数,返回目标元素在数组中的索引,如果未找到则返回-1
int sequential_search(int arr[], int n, int key) {
    for (int i = 0; i < n; i++) {
        if (arr[i] == key) {
            return i; // 找到目标元素,返回其索引
        }
    }
    return -1; // 未找到目标元素,返回-1
}

int main() {
    int arr[] = {1, 3, 5, 7, 9, 11, 13, 15}; // 定义一个整数数组
    int n = sizeof(arr) / sizeof(arr[0]); // 计算数组的长度
    int key = 7; // 要查找的目标元素

    int index = sequential_search(arr, n, key); // 调用顺序查找函数
    if (index != -1) {
        printf("Element %d found at index %d", key, index); // 如果找到目标元素,输出其索引
    } else {
        printf("Element %d not found in the array", key); // 如果未找到目标元素,输出提示信息
    }

    return 0;
}

 02 性能分析

空间复杂度:一个辅助空间。
时间复杂度:

(1) 查找成功时的平均查找长度

       设表中各记录查找概率相等

    ASL s(n)=(1+2+ ... +n)/n =(n+1)/2

(2)查找不成功时的平均查找长度  

     ASL f =n+1

1、记录的查找概率不相等时如何提高查找效率?

      非等概率查找时,可按照查找概率进行排序。

2记录的查找概率无法测定时如何提高查找效率?

     方法——按查找概率动态调整记录顺序:

    (1)在每个记录中设一不访问频度域;

    (2)始终保持记录按非递增有序的次序排列;

    (3)每次查找后均将刚查到的记录直接移至表头。

顺序查找算法的特点:

优点:算法简单,对表结构无任何要求(顺序和链式)

缺点n很大时查找效率较低

  • 36
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值