首页 > 编程语言 >算法简介及二分法

算法简介及二分法

时间:2022-10-13 19:55:26浏览次数:48  
标签:res name 简介 list 二分法 算法 l1 print

目录

算法简介及二分法

1.什么是算法:
	算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
	推荐算法(抖音视频推送 淘宝商品推送)
	成像算法(AI相关)......
 	几乎涵盖了我们日常生活中的方方面面
3.算法工程师要求
	待遇非常好 但是要求也非常高
4.算法部门
	不是所有的互联网公司都养得起算法部分 只有大型互联网公司才有
	算法部门类似于药品研发部分
5.二分法
	是算法中最简单的算法 甚至都称不上是算法
"""
二分法使用要求
    待查找的数据集必须有序
二分法的缺陷
    针对开头结尾的数据 查找效率很低
常见算法的原理以及伪代码
    二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何链表是否成环)
"""
eg:
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
#查找列表中某个数据值
# 方式1:for循环 次数较多
#方式2:二分法 不断的对数据集做二分切割
''''代码实现二分法'''
"""
1. 先取列表的中间索引 
2. 获取中间值
3. 带查找对象与中间值进行比较
4. 如果中间值大了
5.    就保留中间值后面的数据 
6.    然后继续取这个小列表的中间值去进行判断
7.    如果中间还是大了 继续取值判断 切分列表
8. 如果中间值小了
9.   就保留列表后面的数据
10.  然后取这个小列表的中间去进行判断
11.  如果还中间值还小则
12.     继续保留后面的数据继续判断切列表

"""
# 定义我们想要查找的数据值
target_num= 987
def get_middle(l1, target_num):
 # 终止递归的条件
    if len(l1) == 0:
        print('没找到')
        return
    # 1. 获取列表中间索引值
    middle_index = len(l1) // 2
    # 2. 比较目标数据值与中间索引值的大小
    if target_num > l1[middle_index]:
        # 切片保留列表右边一半
        right_l1 = l1[middle_index + 1:]
        print(right_l1)
        return get_middle(right_l1, target_num)
        # 针对右边一半的列表继续二分并判断>>>:感觉要用递归函数
        return get_middle(right_l1, target_num)
    elif target_num < l1[middle_index]:
        # 切片保留列表左边一半
        left_l1 = l1[:middle_index]
        print(left_l1)
        # 针对左边一半的列表继续二分并判断>>>:感觉要用递归函数
        return get_middle(left_l1, target_num)
    else:
        print('找到了')
get_middle(l1,987)

三元表达式

'''
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2

当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
'''

eg:
# 简化步骤1:代码简单并且只有一行 那么可以直接在冒号后面编写
name = 'jason'
# if name == 'jason':print('老师')
# else:print('学生')
# 三元表达式
res = '老师' if name == 'jason' else '学生'
print(res)

各种生成式/表达式/推导式

name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
# 给列表中所有人名的后面加上_N的后缀
# 第一种方式for循环
new_list = []
for name in name_list:
      data = f'{name}_N'
      new_list.append(data)
print(new_list)  # ['jason_N', 'kevin_N', 'oscar_N', 'tony_N', 'jerry_N']

# 列表生成式
# 先看for循环 每次for循环之后再看关键字前面的操作
new_list = [name + '_N' for name in name_list]  # 先看for循环
print(new_list)    # ['jason_N', 'kevin_N', 'oscar_N', 'tony_N', 'jerry_N']
# 复杂情况
new_list = [name + '_N' for name in name_list if name == 'jason']
print(new_list)   # ['jason_N']


new_list = ['大佬' if name == 'jason' else '小白' for name in name_list if name != 'jack']
print(new_list)   # ['大佬', '小白', '小白', '小白', '小白']
# 字典生成式
s1 = 'hello world'
for i,j in enumerate(s1,start=100):
    print(i,j)  # 100 h 101 e 102 l 103 l 104 o 105
# 相当于前面加了个序号,从100开始
# enumerate 相当于打印坐标位置
d1 = {i: j for i, j in enumerate('hello')}
print(d1)   #{0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o'} 变成键值对
# 集合生成式
res = {i for i in 'hello'}
print(res)  #{'l', 'h', 'o', 'e'}  无序、去重
# 元组生成式>>>:没有元组生成式 下列的结果是生成器
res = (i+'AS' for i in 'hello')
print(res)
for i in res:
    print(i)

匿名函数

没有名字的函数 需要使用关键字lambda
语法结构
	lambda 形参:返回值
使用场景
	lambda a,b:a+b
匿名函数一般不单独使用 需要配合其他函数一起用

eg:
# 语法结构:
def my_add(a, b):
    return a + b
res = my_add(1,2)
print(res)

res = lambda a,b:a+b
print(res)
ret = res(1, 2)
print(ret)

常见内置函数

1.map()	映射
# 都是用了for 循环
l1 = [1, 2, 3, 4, 5]
# def func(a):
#     return a + 1
res = map(lambda x:x+1, l1)   # 就是把代码变得简单
print(list(res))
2.max()\min()
简单的:
l1 = [11, 22, 33, 44]
res = max(l1)
print(res)

d1 = {
    'zj': 100,
    'jason': 8888,
    'break': 999999,
    'oscar': 1
}

res = max(d1)
print(res)     # zj   这时比的是键的大小 A-Z 65-90  a-z 97-122


def func(a):
    return d1.get(a)
# 先用for循环获取的是前面的键 k就是键,然后d1.get(k)就是得到键对应的值
# 然后比的是匿名函数处理之后的返回值作为比较的依据
# 但是max用的还是前面的键所以返回的还是键
res = max(d1, key=lambda k:d1.get(k))
print(res)

# 不用匿名函数时
def func(a):
    return d1.get(a)
res = max(d1, key=func)
print(res)
"""传多个值 返回一个值"""
3.reduce
from functools import reduce
l1 = [1, 2, 3, 4, 5]
res = reduce(lambda a, b: a + b, l1)
print(res)  # 15

标签:res,name,简介,list,二分法,算法,l1,print
From: https://www.cnblogs.com/wxlxl/p/16789454.html

相关文章