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


    基于线性表的查找法

    顺序查找

    算法思想

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

    假设列表长度为$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))
    
    
  • 相关阅读:
    请求headers处理
    requests模块
    urllib3
    urllib
    百度AI搜索引擎
    CSS层叠样式表--使用
    学习requests_html
    聚合新闻头条
    爬虫工程师的月薪如何?
    Linux日志系统
  • 原文地址:https://www.cnblogs.com/Leon-The-Professional/p/9950099.html
Copyright © 2020-2023  润新知