zoukankan      html  css  js  c++  java
  • 递归与列表查找(二分查找)

    递归:

      调用自身(自己调用自己)

      结束条件(递归最大深度)

    def func3(x):
        if x > 0:
            print(x)
            func3(x-1)
    
    func3(5)
    # 执行结果
    5 4 3 2 1
    def func4(x):
        if x > 0:
            func4(x-1)
            print(x)
    func4(5)
    
    # 执行结果
    1 2 3 4 5 

    时间复杂度

    时间复杂度:用来评估算法运行时间的一个公式(单位)。

    一般来说,时间复杂度高的算法比复杂度低的算法慢。

    常见的时间复杂度(按效率排序)

      O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

    print("hello world")    O(1)

    for i in range(n):
        print('hello world')            O(n)

    如何一眼判断时间复杂度?

      循环减半的过程

      O(logn) 几次循环就是n的几次方的复杂度

    空间复杂度

    空间复杂度:用来评估算法内存占用大小的一个式子

    “空间换时间”:

      变量O(1)    

      列表O(n)    

      二维列表O(n2)    

      三维列表O(n3)

    列表查找

    列表查找:从列表中查找指定元素

      顺序查找

        从列表第一个元素开始,顺序进行搜索,直到找到为止。

      二分查找

        从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

    # 二分查找[1,2,3,4,5,6,7,8]

    import
    random import time def cal_time(func): """ 测试时间装饰器 :param func: 接收一个函数 :return: """ def wrapper(*args, **kwargs): ti = time.time() x = func(*args, **kwargs) ti2 = time.time() print("time cost:", func.__name__, ti2 - ti) return x return wrapper @cal_time def search(data_set, val): """ 二分查找 :param data_set:有序列表 :param val:要查找的值 :return:列表下标 """ low = 0 high = len(data_set) - 1 while low <= high: mid = (low + high) // 2 if data_set[mid] == val: return mid elif data_set[mid] < val: low = mid + 1 else: high = mid - 1 return val ls = list(range(10000)) print(search(ls, 5050)) -----------------返回测试结果------------------ time cost: search 0.0 5050

    生成:[{'name': '王洋', 'id': 1001, 'age': 39}, {'name': '赵丽', 'id': 1002, 'age': 37}]

    import random
    
    def random_list(n):
        """
        [{'name': '王洋', 'id': 1001, 'age': 39}, {'name': '赵丽', 'id': 1002, 'age': 37}]
        :param n:
        :return:
        """
        result = []
        a1 = ["", "", "", ""]
        a2 = ["", "", " ", "", ""]
        a3 = ["", "", ""]
        ids = list(range(1001, 1001+n))
        for i in range(n):
            dicts = {}
            dicts["age"] = random.randint(18, 60)
            dicts["id"] = ids[i]
            dicts["name"] = random.choice(a1)+random.choice(a2)+random.choice(a3)
            result.append(dicts,)
        return result
    import random
    
    def tw_search(data_set, val):
        """
        二分查找
        :param data_set:[{'id': 1001, 'age': 42, 'name': '赵 艳'}, {'id': 1002, 'age': 33, 'name': '王洋'}]
        :param val:需要找查的ID值 ”1002“
        :return:返回列表下标
        """
        low = 0
        high = len(data_set) - 1
        while low <= high:
            mid = (low + high) // 2
            if data_set[mid]["id"] == val:
                return mid
            elif data_set[mid]["id"] < val:
                low = mid + 1
            else:
                high = mid - 1
        return
    
    data = random_list(1000)
    a = tw_search(data, 1805)
    print(data[a])
    
    ---------------------执行结果---------------------
    {'id': 1805, 'age': 37, 'name': '孙丽艳'}
  • 相关阅读:
    压测基础
    性能压测终极武器之arthas
    python 返回当前文件夹下的所有文件的绝对路径;打印文件中的中文字符
    python 虚拟环境及项目快速迁移
    python3 解决bytes转str时抛“UnicodeDecodeError”异常
    mac系统环境变量
    kafka生产消费消息
    mac pycharm打不开问题
    jmeter获取毫秒时间戳
    两种方式 获取数据库某个表中所有的数据数量条数
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/6515707.html
Copyright © 2011-2022 走看看