数据结构之查找-基于线性表的查找法

基于线性表的查找法

顺序查找

算法思想

用所给的元素与列表的中的各个元素进行比较,若相等返回索引,否则返回错误信息。

假设列表长度为$n$那么查找第$i$个元素时需进行$n-i+1$次比较,即$C_i=n-i+1$,又假设查找每个数据元素的概率相等,即$P_i =1/n$,则顺序查找成功的平均查找长度为
$ASL_{succ} = quadsum_{i=1}^n{P_iC_i}=(n+1)/2$

Python代码清单

import sys
import time
## 直接查找

class SeqSearch(object):
    '''
    SeqSearch 是直接查找算法,
    使用 search方法进行查找操作
    不返回任何值,因为没有后续的处理直接输出即可。
    '''

    list_a = []

    def __init__(self, number1, aim1):
        # 初始化操作
        for item in range(number1):
            self.list_a.append(item)
        self.aim = aim1

    def search(self):
        flag = 0
        for item in self.list_a:
            if item == self.aim:
                flag = 1
                break
            else:
                pass
        if flag == 0:
            print('没有这个数')
        else:
            print('找到了。')


if __name__ == '__main__':
    # 帮助文本
    help_info = '''  
         This program is for SeqSearch.
         How to use it! Follow the example!

         python SeqSearch 5 3

         The 5 representative will generate five numbers.
         search 3
    '''
    # 接受系统传的参数。
    command = sys.argv[0:]
    # 判断输入是否合法。
    if len(command) != 3 or 'help' in command:
        print(help_info)
    else:
        try:
            # 试图将文本型转化为int。
            number = int(command[1])
            aim = int(command[2])
        except ValueError:
            # 转化失败,提示信息并退出。
            print(help_info)
            sys.exit(1)
        # 一切就绪,实例化类对象。
        look = SeqSearch(number, aim)
        time_start = time.time()  # 记录开始时间
        look.search()  # 调用查找算法。
        time_end = time.time()  # 记录结束时间。
        print('花费的时间是%f' % (time_end-time_start))

折半查找

折半查找又称为二分法查找,这种方法对待查找的列表有两个要求,一是必须采用顺序存储结构,二是必须按照关键字大小有序排列。

算法思想

首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等则查找成功,否则利用中间位置将表分为前后两个子表,如果中间的关键字大于要查找的关键字,则进一步查找前子表,否则查找后面的子表。重复以上过程直到查找成功,或不存在为止。

平均查找长度。假设表的长度$n=2h-1$,则相应的判定树的深度是$h$的满二叉树,$h=long_2{n+1}$。又假设每个记录查找到的概率相等,则查找成功时的平均查找长度为
$ASL_{bs} = quadsum_{i=1}n{P_iC_i}约等于log_2{(n+1)}-1 $

Python代码清单

import sys
import time


class BinSearch(object):
    '''
    BinSearch 是折半查找算法,
    使用 search方法进行查找操作
    不返回任何值,因为没有后续的处理直接输出即可。
    '''

    list_a = []

    def __init__(self, number1, aim1):
        # 初始化操作
        for item in range(number1):
            self.list_a.append(item)
        self.aim = aim1

    def search(self):
        flag = 0
        low = 0
        high = len(self.list_a) - 1  # 获取高位
        while low < high:  # 条件是不交叉
            mid = int((low + high)/2)  # 选择中间位置
            if self.list_a[mid] == self.aim:
                flag = 1  # 找到值
                break
            else:
                if self.list_a[mid] > self.aim:
                    high = mid - 1
                if self.list_a[mid] < self.aim:
                    low = mid + 1
        if flag == 0:
            print('找不到哇哇')
        if flag == 1:
            print('找到了啊')


if __name__ == '__main__':
    # 帮助文本
    help_info = '''  
         This program is for BinarySearch.
         How to use it! Follow the example!

         python BinSearch 5 3

         The 5 representative will generate five numbers.
         search 3
    '''
    # 接受系统传的参数。
    command = sys.argv[0:]
    # 判断输入是否合法。
    if len(command) != 3 or 'help' in command:
        print(help_info)
    else:
        try:
            # 试图将文本型转化为int。
            number = int(command[1])
            aim = int(command[2])
        except ValueError:
            # 转化失败,提示信息并退出。
            print(help_info)
            sys.exit(1)
        # 一切就绪,实例化类对象。
        look = BinSearch(number, aim)
        time_start = time.time()  # 记录开始时间
        look.search()  # 调用查找算法。
        time_end = time.time()  # 记录结束时间。
        print('花费的时间是%f' % (time_end-time_start))

原文地址:https://www.cnblogs.com/Leon-The-Professional/p/9950099.html