文章目录

  • 算法与数据结构
    • 时间复杂度
    • 排序算法
      • 简单排序
      • 鸡尾酒排序(搅拌排序)
      • 归并排序
      • 快速排序
    • 查找算法
      • 顺序查找
      • 折半查找(二分查找)
    • 内置模块
      • heapq模块
      • itertools模块
      • collections模块
  • 常用算法
    • 穷举法
    • 贪心算法(贪婪法)
    • 分治法
    • 回溯法
    • 动态规划

算法与数据结构

  • 评价算法的好坏:渐近时间复杂度和渐近空间复杂度。

时间复杂度

  • 渐近时间复杂度的大O标记:

    • - 常量时间复杂度 - 布隆过滤器 / 哈希存储
    • - 对数时间复杂度 - 折半查找(二分查找)
    • - 线性时间复杂度 - 顺序查找 / 桶排序
    • - 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序)
    • - 平方时间复杂度 - 简单排序算法(选择排序、插入排序、冒泡排序)
    • - 立方时间复杂度 - Floyd算法 / 矩阵乘法运算
    • - 几何级数时间复杂度 - 汉诺塔
    • - 阶乘时间复杂度 - 旅行经销商问题 - NP

排序算法

简单排序

def select_sort(origin_items, comp=lambda x, y: x < y):"""简单选择排序"""items = origin_items[:]for i in range(len(items) - 1):min_index = ifor j in range(i + 1, len(items)):if comp(items[j], items[min_index]):min_index = jitems[i], items[min_index] = items[min_index], items[i]return items

鸡尾酒排序(搅拌排序)

def bubble_sort(origin_items, comp=lambda x, y: x > y):"""高质量冒泡排序(搅拌排序)"""items = origin_items[:]for i in range(len(items) - 1):swapped = False# 最大值放在后面for j in range(i, len(items) - 1 - i):if comp(items[j], items[j + 1]):items[j], items[j + 1] = items[j + 1], items[j]swapped = Trueif swapped:# 可能已排序好,提前终止遍历swapped = False# 最小值放在前面for j in range(len(items) - 2 - i, i, -1):if comp(items[j - 1], items[j]):items[j], items[j - 1] = items[j - 1], items[j]swapped = Trueif not swapped:breakreturn items

归并排序

def merge_sort(items, comp=lambda x, y: x <= y):"""归并排序(分治法)"""if len(items) < 2:return items[:]mid = len(items) // 2left = merge_sort(items[:mid], comp)right = merge_sort(items[mid:], comp)return merge(left, right, comp)def merge(items1, items2, comp):"""合并(将两个有序的列表合并成一个有序的列表)"""items = []index1, index2 = 0, 0while index1 < len(items1) and index2 < len(items2):if comp(items1[index1], items2[index2]):items.append(items1[index1])index1 += 1else:items.append(items2[index2])index2 += 1items += items1[index1:]items += items2[index2:]return items

快速排序

"""
快速排序 - 选择枢轴对元素进行划分,左边都比枢轴小右边都比枢轴大
"""
def quick_sort(origin_items, comp=lambda x, y: x <= y):items = origin_items[:]_quick_sort(items, 0, len(items) - 1, comp)return itemsdef _quick_sort(items, start, end, comp):if start < end:pos = _partition(items, start, end, comp)_quick_sort(items, start, pos - 1, comp)_quick_sort(items, pos + 1, end, comp)def _partition(items, start, end, comp):pivot = items[end]i = start - 1for j in range(start, end):if comp(items[j], pivot):i += 1items[i], items[j] = items[j], items[i]items[i + 1], items[end] = items[end], items[i + 1]return i + 1

查找算法

顺序查找

def seq_search(items, key):"""顺序查找"""for index, item in enumerate(items):if item == key:return indexreturn -1

折半查找(二分查找)

def bin_search(items, key):"""折半查找"""start, end = 0, len(items) - 1while start <= end:mid = (start + end) // 2if key > items[mid]:start = mid + 1elif key < items[mid]:end = mid - 1else:return midreturn -1

内置模块

heapq模块

  一种著名的数据结构是堆(heap),它是一种优先队列。优先队列让你能够以任意顺序添加对象,并随时(可能是在两次添加对象之间)找出(并删除)最小的元素。相比于列表方法min,这样做的效率要高得多。实际上,Python没有独立的堆类型,而只有一个包含一些堆操作函数的模块。这个模块名为heapq(其中的q表示队列)。
模块heapq中的一些重要函数

函数 描述
heappush(heap,x) 将x压入堆中
heappop(heap) 从堆中弹出最小的元素
heapify(heap) 让列表具备堆特征
heapreplace(heap,x) 弹出最小的元素,并将x压入堆中
nlargest(n,iter) 返回iter中n个最大的元素
nsmallest(n,iter) 返回iter中n给最小的元素
"""
从列表中找出最大的或最小的N个元素
堆结构(大根堆/小根堆)
"""
import heapqlist1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]
list2 = [{'name': 'IBM', 'shares': 100, 'price': 91.1},{'name': 'AAPL', 'shares': 50, 'price': 543.22},{'name': 'FB', 'shares': 200, 'price': 21.09},{'name': 'HPQ', 'shares': 35, 'price': 31.75},{'name': 'YHOO', 'shares': 45, 'price': 16.35},{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
print(heapq.nlargest(3, list1))
print(heapq.nsmallest(3, list1))
print(heapq.nlargest(2, list2, key=lambda x: x['price']))
print(heapq.nlargest(2, list2, key=lambda x: x['shares']))

itertools模块

"""
迭代工具 - 排列 / 组合 / 笛卡尔积
"""
import itertoolsitertools.permutations('ABCD')
itertools.combinations('ABCDE', 3)
itertools.product('ABCD', '123')

collections模块

Python3 collections模块使用详解包括Counter,deque,defaultdict,namedtuple,OrderedDict等

常用算法

穷举法

又称为暴力破解法,对所有的可能性进行验证,直到找到正确答案。如百钱百鸡,五人分鱼等。

     # 公鸡5元一只 母鸡3元一只 小鸡1元三只# 用100元买100只鸡 问公鸡/母鸡/小鸡各多少只for x in range(20):for y in range(33):z = 100 - x - yif 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:print(x, y, z)# A、B、C、D、E五人在某天夜里合伙捕鱼 最后疲惫不堪各自睡觉# 第二天A第一个醒来 他将鱼分为5份 扔掉多余的1条 拿走自己的一份# B第二个醒来 也将鱼分为5份 扔掉多余的1条 拿走自己的一份# 然后C、D、E依次醒来也按同样的方式分鱼 问他们至少捕了多少条鱼fish = 6while True:total = fishenough = Truefor _ in range(5):if (total - 1) % 5 == 0:total = (total - 1) // 5 * 4else:enough = Falsebreakif enough:print(fish)breakfish += 5

贪心算法(贪婪法)

在对问题求解时,总是做出在当前看来最好的选择,不追求最优解,快速找到满意解。典型例子是背包问题

     """贪婪法:在对问题求解时,总是做出在当前看来是最好的选择,不追求最优解,快速找到满意解。输入:20 6电脑 200 20收音机 20 4钟 175 10花瓶 50 2书 10 1油画 90 9"""class Thing(object):"""物品"""def __init__(self, name, price, weight):self.name = nameself.price = priceself.weight = weight@propertydef value(self):"""价格重量比"""return self.price / self.weightdef input_thing():"""输入物品信息"""name_str, price_str, weight_str = input().split()return name_str, int(price_str), int(weight_str)def main():"""主函数"""max_weight, num_of_things = map(int, input().split())all_things = []for _ in range(num_of_things):all_things.append(Thing(*input_thing()))all_things.sort(key=lambda x: x.value, reverse=True)total_weight = 0total_price = 0for thing in all_things:if total_weight + thing.weight <= max_weight:print(f'小偷拿走了{thing.name}')total_weight += thing.weighttotal_price += thing.priceprint(f'总价值: {total_price}美元')if __name__ == '__main__':main()

分治法

把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到可以直接求解的程度,最后将子问题的解进行合并得到原问题的解。如上面讲到的归并排序,以及快速排序等。

回溯法

回溯法又称为试探法,按选优条件向前搜索,当搜索到某一步发现原先选择并不优或达不到目标时,就退回一步重新选择。
骑士巡逻,八皇后,迷宫寻路等

"""递归回溯法;骑士巡逻"""import sysimport timeSIZE = 5total = 0def print_board(board):for row in board:for col in row:print(str(col).center(4), end='')print()def patrol(board, row, col, step=1):if row >= 0 and row < SIZE and \col >= 0 and col < SIZE and \board[row][col] == 0:board[row][col] = stepif step == SIZE * SIZE:global totaltotal += 1print(f'第{total}种走法: ')print_board(board)patrol(board, row - 2, col - 1, step + 1)patrol(board, row - 1, col - 2, step + 1)patrol(board, row + 1, col - 2, step + 1)patrol(board, row + 2, col - 1, step + 1)patrol(board, row + 2, col + 1, step + 1)patrol(board, row + 1, col + 2, step + 1)patrol(board, row - 1, col + 2, step + 1)patrol(board, row - 2, col + 1, step + 1)board[row][col] = 0def main():board = [[0] * SIZE for _ in range(SIZE)]patrol(board, SIZE - 1, SIZE - 1)if __name__ == '__main__':main()

动态规划

基本思想也是将待求解问题分解成若干个子问题,先求解并保存这些子问题的解,避免产生大量的重复运算。

"""斐波拉切数列,不使用动态规划将会是几何级数复杂度"""def fib(num, temp={}):"""用递归计算Fibonacci数"""if num in (1, 2):return 1try:return temp[num]except KeyError:temp[num] = fib(num - 1) + fib(num - 2)return temp[num]

子列表元素之和的最大值

说明:子列表指的是列表中索引(下标)连续的元素构成的列表;列表中的元素是int类型,可能包含正整数、0、负整数;程序输入列表中的元素,输出子列表元素求和的最大值,例如:

def main():items = list(map(int, input().split()))size = len(items)overall, partial = {}, {}overall[size - 1] = partial[size - 1] = items[size - 1]for i in range(size - 2, -1, -1):partial[i] = max(items[i], partial[i + 1] + items[i])overall[i] = max(partial[i], overall[i + 1])print(overall[0])if __name__ == '__main__':main()

【Python入门基础】算法与数据结构相关推荐

  1. Python入门基础知识学什么?

    Python基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python入门基础知识学什么呢?来看看下面小编的详细介 ...

  2. Python入门基础(下)之魔方方法

    Python入门基础(下)之魔方方法 一.学习内容概括 学习地址:https://tianchi.aliyun.com/s/58327c15d1faee512c008128d3bb9e32 今天主要学 ...

  3. python笔记基础-Python入门基础知识学习笔记之一

    为什么要写这篇文章? 本人做过Objective-C开发,现在在用C#做WinForm开发.近段时间在学习Python入门基础知识时,发现有很多知识点和Objective-C的不一样.故想通过本文记录 ...

  4. python入门基础代码初学

    python入门基础代码初学 一.检查python安装 二.print使用 二.使用python运算 三.enumerate()函数 一.检查python安装 PS C:\Users\admin> ...

  5. 【目录】Python 入门基础篇 <(^-^)>

    Python 入门基础篇 一.关于Python的介绍与准备工作 Python基础介绍 Jupyter notebook基础介绍 Jupyter notebook打开问题 Jupyter noteboo ...

  6. python 判断列表所有元素是否为某个值_这应该是最详细的Python入门基础语法总结!...

    这应该是最详细的Python入门基础语法总结! 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 input 用户自己输入值 print 打印值 可以输出多个变量 %d|%s 用于输 ...

  7. python入门基础教程-Python入门基础教程:WSGI

    原标题:Python入门基础教程:WSGI WSGI 简介 WSGI 是什么 WSGI 是 Python Web Server Gateway Interface 的缩写,是描述 Web 服务器与 P ...

  8. Python入门基础总结笔记——正则表达式

    Python入门基础总结笔记--正则表达式 完整基础知识参看网站:正则表达式 总结重点 用\d可以匹配一个数字,\w可以匹配一个字母或数字 用*表示任意个字符(包括0个),用+表示至少一个字符 用?表 ...

  9. B站马士兵python入门基础版详细笔记(6)

    前言: 这篇文章是B站学习python入门基础班的视频的第五 六章内容,主要讲述的是列表,主要包括列表的创建,以及他的元素的增.删.查.改操作命令. 一.列表的初始化 为什么要使用列表? 列表就好比C ...

  10. B站马士兵python入门基础版详细笔记(4)

    前言: 这篇文章是B站学习python入门基础班的视频的第四章内容,主要讲述的是if-else语句,但是不包括循环结构,循环结构在下一章笔记中有记叙 一.顺序结构 什么是顺序结构呢?比如说 '''把大 ...

最新文章

  1. 1005. 继续(3n+1)猜想 (25)
  2. 【汇编语言与计算机系统结构笔记13】简单的上机过程示例
  3. 最长公共子串_两个字符串的最长公共子串(后缀自动机)
  4. 移动端微信、QQ、浏览器调用qq临时会话功能
  5. PAT考试大纲/如何刷pat(想要在pat甲级拿80到90分)
  6. 用Java写倒叙数字输出
  7. 计算机组老师颁奖词,优秀教研团队颁奖词
  8. 【火车头采集】如何采集一个网页的多张图片并且下载
  9. 20190926CF训练
  10. 周志华老师开课啦!机器学习视频课上线了(附地址)
  11. python 爬取微信朋友圈的一些信息
  12. 钉钉在线课堂回看发给对方观看需要这样做
  13. java 自行车_JAVA 2020款山地车盘点
  14. python xlsx表格最大行最大列
  15. MySQL学习笔记——数据库的创建、修改与删除
  16. 查看Windows、Office 是否永久激活
  17. 隧道工具——socat
  18. 对话 CTO〡和 PingCAP CTO 黄东旭聊开源数据库新蓝海
  19. PSD模版如何变成网页模版
  20. 华为OD机试题,用 Java 解【新员工座位安排系统】问题 | 含解题说明

热门文章

  1. excel 有多列,分开显示(操作简单,便于理解)
  2. 天文学家对外星文明的分类如何指导我们探索AI?
  3. 企业实名认证的几种方案
  4. 在输入框里输入一个时间,获得倒计时时间,点击开始计时,便可以开始计时,点击停止计时按钮,则停止计时。
  5. 怎么画出好看的神经网络图,神经元怎么画简笔画
  6. POI Excel操作
  7. 6种职场潜规则被曝光了!你经历过几种?
  8. 你知道ChatGPT里面的G、P、T分别代表什么吗?
  9. 性价比高口碑最好的TWS耳机,2022性价比无线蓝牙耳机排行榜
  10. 蓝桥杯单片机 超声波模块和PCA模块