递归与列表查找(二分查找)

递归:

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

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

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': '孙丽艳'}

 

posted @ 2017-03-07 17:06  yxy_linux  阅读(307)  评论(0编辑  收藏  举报