python面试准备之--算法一

news2024/11/26 20:37:44

文章目录

  • 时间复杂度
  • 空间复杂度
  • 递归
  • 汉诺塔问题(递归实例)
  • 查找
    • 列表查找
    • 顺序查找(Linear Search)
    • 二分查找
  • 排序
    • 列表排序
    • 冒泡排序(Bubble Sort)
    • 选择排序
    • 插入排序
    • 快速排序
    • 堆排序
    • 归并排序
    • 希尔排序
    • 计数排序
    • 基数排序

时间复杂度

  • 时间复杂度是用来估计算法运行时间的一个式子(单位)

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

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

    • O(1) < O(logn) <O(n) < O(nlogn) < O(n^2) < O(n ^2logn) < O(n^3)
  • O(1)和O(n)和O(n^2),评估一个算法运行时间的单位

  • 基础计算在计算机里面,只要没上升到n的级别时间复杂度都是O(1)

  • O(1): 可以理解为1s,简单计算都在1s内完成

# O(1)
print('hello world')

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

# O(n^2)
for i in range(n):
	for j in range(n):
		print('hello world')

# O(n^3)
for i in range(n):
	for j in range(n):
		for k in range(n):
			print('hello world')

# O(3) ? 错,是O(1),因为O(1)理解为是单位
print('hello world')
print('hello world')
print('hello world')

# 假设n = 64
# O(log2n) 或 O(logn) 因为,2^6 = 64 
while n > 1:
	print(n)
	n = n // 2
  • 如何快速判断算法复杂度?(简单算法)
    • 确定问题规模n
    • 循环减半过程 logn
    • k层关于n的循环 (n的几次方) n^k

空间复杂度

  • 用来评估算法内存占用大小的式子
  • 空间复杂度的表示方式与时间复杂度完全一样
    • 算法使用了几个变量: O(1)
    • 算法使用长度为n的一维列表:O(n)
    • 算法使用了m行n列的二维列表: O(mn)
  • 空间换时间

递归

  • 递归的两个特点
    • 调用自身
    • 结束条件

汉诺塔问题(递归实例)

  • n = 2 的时候步骤:
    • 小盘子从a到b
    • 大盘子从a到c
    • 小盘子从b到c
  • n个的步骤:
    • n-1 从a经过c到b
    • n从a到c
    • n-1从b经过a到c
# 按照上面的逻辑实现
def hanoi(n, a, b, c):
    if n > 0:
        hanoi(n-1, a, c, b)
        print('moving from %s to %s' % (a, c))
        hanoi(n-1, b, a, c)

hanoi(3, 'A', 'B', 'C')

查找

  • 什么是查找?在一些元素中,通过一定方法找出与给定关键字相同的数据元素的过程

列表查找

  • 什么是列表查找?从列表中查找指定元素
    • 输入:列表,待查找元素
    • 输出: 元素下标(未找到元素时一般返回None或-1)
  • 内置列表查找函数:index()

顺序查找(Linear Search)

  • 也叫线性查找,从列表第一个元素开始,顺序进行搜索,知道找到元素或者搜索到列表的最后一个元素为止
# 时间复杂度:O(n)
def linear_search(li, val):
    for ind, v in enumerate(li):
        if v == val:
            return ind
    else:
        return None

print(linear_search([1, 2, 3], 2))

二分查找

  • 又叫折半查找,从有序列表的初始化候选区间li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
  • 前提:有顺序,取中间值,比较大小,目标值在的区域叫做候选区,如何维护候选区?left 和right中间值是mid
# 时间复杂度:O(logn)
def binary_search(li, val):
    left = 0
    right = len(li) - 1
    while left <= right:  # 候选区有值
        mid = (left + right) // 2
        if li[mid] == val:
            return mid
        elif li[mid] > val:  # 待查找的值在mid左侧
            right = mid - 1
        else:  # mid小于val, 待查找的值在mid右侧
            left = mid + 1
    else:
        return None


li = [1, 2, 3, 4, 5]
print(binary_search(li, 3))

排序

  • 什么是排序?将一组无序的记录序列调整为有序的记录序列

列表排序

  • 将无序列表变为有序列表
    • 输入:列表
    • 输出:列表
  • 升序和降序
  • 内置排序函数:sort()

冒泡排序(Bubble Sort)

  • 列表每两个相邻的数,如果前面比后面的大,则交换这两个数
  • 一趟排序完成后,则无序区较少一个数,有序区增加一个数。
  • 代码关键点:趟、无序区范围
import random


# 复杂度o(n^2)
def bubble_sort(li):
    for i in range(len(li) - 1):  # i表示i趟,且是从0开始的
        for j in range(len(li) - i - 1):
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]


li = [random.randint(0, 10) for i in range(5)]
print(li)
bubble_sort(li)
print(li)


# 复杂度o(n^2), 升级版,就是当一趟不发生任何交换的时候,直接返回结果
def bubble_sort(li):
    for i in range(len(li) - 1):  # i表示i趟,且是从0开始的
        exchange = False
        for j in range(len(li) - i - 1):
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]
                exchange = True
        print(li)
        if not exchange:
            return


li = [9, 8, 7, 1, 2, 3, 4, 5, 6]
print(li)
bubble_sort(li)
print(li)

选择排序

  • 一趟排序记录最小的数,放到第一位
  • 再一趟排序记录记录列表无序区最小的数, 放到第二位
  • 。。。。。

算法关键点:有序区和无序区、无序区最小数的位置

# 时间复杂度o(n^2)
def select_sort_simple(li):
    li_new = []
    for i in range(len(li)):
        min_val = min(li)
        li_new.append(min_val)
        li.remove(min_val)
    return li_new


# 时间复杂度o(n^2)
def select_sort(li):
    for i in range(len(li) - 1):  # 第几趟
        min_loc = i
        for j in range(i + 1, len(li)):  # 无序区长度
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]
    return li


li = [9, 8, 7, 1, 2, 3, 4, 5, 6]
print(select_sort_simple(li))
li = [9, 8, 7, 1, 2, 3, 4, 5, 6]
print(select_sort(li))

插入排序

  • 初始手里(有序区)只有一张牌
  • 每次从无序区摸出一张牌, 插入到手里已有牌的正确位置
    在这里插入图片描述
# 时间复杂度O(n^2)
def inster_sort(li):
    for i in range(1, len(li)):  # 表示摸到的牌的下标
        tmp = li[i]
        j = i - 1  # j指的是手里的牌的下标
        while li[j] > tmp and j >= 0:
            li[j + 1] = li[j]
            j -= 1
        li[j + 1] = tmp
        print(li)


li = [3, 2, 44, 1, 5, 7, 9, 6, 8]
print(li)
inster_sort(li)

快速排序

在这里插入图片描述

  • 思路
    • 取一个元素p(第一个元素),使元素p归位
    • 列表被p分成两部分,左边都比p小,右边都比p大
    • 递归完成排序
  • 快速排序的时间复杂度:O(nlogn)
  • 快速排序存在的问题
    • 最坏情况,数据是由大到小排序的,每次就丢掉一个,时间复杂度是O(n^2)
    • 递归:递归耗费比较多的资源
def partition(li, left, right):  # 列表, 左边下标,右边下标, 返回中间值的下标
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp:  # 从右边找比tmp小的数
            right -= 1  # 往左走一位
        li[left] = li[right]  # 把右边的值填写到左边
        print(li, 'right')
        while left < right and li[left] <= tmp:
            left += 1
        li[right] = li[left]  # 把左边的值写到右边空位上
        print(li, 'left')
    li[left] = tmp  # 把tmp归位
    return left


def quick_sort(li, left, right):
    if left < right:  # 至少两个元素
        mid = partition(li, left, right)
        quick_sort(li, left, mid - 1)
        quick_sort(li, mid + 1, right)


li = [5, 7, 4, 6, 3, 1, 2, 9, 8]
print(li)
quick_sort(li, 0, len(li) - 1)
print(li)

堆排序

  • 知识准备
    • 树是一种数据结构。 比如:目录结构
    • 树是一种可以递归定义的数据结构

归并排序

希尔排序

计数排序

基数排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器(深度)学习中的 Dropout

在这篇文章[1]中&#xff0c;我将主要讨论神经网络中 dropout 的概念&#xff0c;特别是深度网络&#xff0c;然后进行实验&#xff0c;通过在标准数据集上实施深度网络并查看 dropout 的影响&#xff0c;看看它在实践中实际影响如何。 1. Dropout是什么&#xff1f; ★ 术语“…

迷宫最短路径【Java实现】

题目描述 现有一个n∗m大小的迷宫&#xff0c;其中1表示不可通过的墙壁&#xff0c;0表示平地。每次移动只能向上下左右移动一格&#xff0c;且只能移动到平地上。假设左上角坐标是(1,1)&#xff0c;行数增加的方向为x增长的方向&#xff0c;列数增加的方向为y增长的方向&#…

Protocol Buffers V3语法全解

目录protobuf介绍protobuf使用protoc命令语法定义消息类型指定字段类型分配字段编号指定字段规则添加更多消息类型注释保留字段从.proto文件生成了什么&#xff1f;值类型默认值枚举使用其他消息类型导入定义嵌套类型更新消息类型未知字段any任意类型oneofoneof 特性兼容性问题…

awk命令

一.介绍 awk是专门为文本处理设计的编程语言&#xff0c;是一门数据驱动的编程语言。与sed类似&#xff0c;都是以数据驱动的行处理软件&#xff0c;主要用于数据扫描&#xff0c;过滤和汇总。数据可以来自于标准输入&#xff0c;管道或者文件。 二.语法 awk是一种处理文本文件…

Vite+Vue3实现版本更新检查,实现页面自动刷新

ViteVue3实现版本更新检查&#xff0c;实现页面自动刷新1、使用Vite插件打包自动生成版本信息2、Vite.config.ts配置3、配置环境变量4、路由配置现有一个需求就是实现管理系统的版本发版&#xff0c;网页实现自动刷新页面获取最新版本 搜索了一下&#xff0c;轮询的方案有点浪费…

Mysql:避免重复的插入数据方法汇总

最常见的方式就是为字段设置主键或唯一索引&#xff0c;当插入重复数据时&#xff0c;抛出错误&#xff0c;程序终止&#xff0c;但这会给后续处理带来麻烦&#xff0c;因此需要对插入语句做特殊处理&#xff0c;尽量避开或忽略异常&#xff0c;下面我介绍4种方法&#xff1a; …

【Windows10】电脑副屏无法调节屏幕亮度?解决方法

先说下情况&#xff0c;本人对显示器不太懂&#xff0c;属于小白 这个副屏无法调节的问题出现也已经很久了&#xff0c;但是之前亮度适合就无所谓&#xff0c;今天突然按了之后很亮&#xff0c;于是就找问题。 第一步&#xff0c;我直接百度&#xff0c;遇事不决&#xff0c;百…

59 双向循环神经网络【动手学深度学习v2】

59 双向循环神经网络【动手学深度学习v2】 深度学习学习笔记 学习视频&#xff1a;https://www.bilibili.com/video/BV12X4y1c71W/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 核心思想&#xff1a;取决于过去和未来的上下文&#xff0c;来预测当前的…

Apache Spark 命令注入(CVE-2022-33891)

利用范围 Spark Core - Apache <3.0.3 3.1.1 < Spark Core - Apache <3.1.2 3.2.0 < Spark Core - Apache <3.2.1 环境搭建 修改bin目录下的spark-shell 修改如下&#xff0c;添加调试端口 变动如上 然后启动 ./spark-shell --conf spark.acls.enabletrue即…

使用百度地图官方WEB API,提示 “ APP 服务被禁用“ 问题的解决方法

问题描述 项目上用了百度地图官方WEB API&#xff0c;打开界面时百度地图无法打开&#xff0c;出现弹窗&#xff1a; APP被您禁用啦。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 原因分析&#xff1a; 查看错误信息&#xff1a;"status":240,…

Word文档带有权限密码怎么办?

Word文档的权限密码指的是什么&#xff1f;其实这是Word文档的保护方法之一&#xff0c;具体指Word文档的编辑、修改受到了限制&#xff0c;需要输入密码才能进行。 设置了权限密码的Word文档还是可以直接打开&#xff0c;只有当需要编辑或者修改内容的时候&#xff0c;才会发…

CSDN版的详细MarkDown的使用教程

MarkDown的使用欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释…

雅思经验(7)

我发现雅思阅读要命的不是难度&#xff0c;而是时间的把控。考试时间是总共一小时&#xff0c;但是要写三篇文章&#xff0c;之后总共40道题目&#xff0c;也就是说每篇文章平均是13.3道。但是他们很多人说&#xff0c;如果誊写答案需要花掉3、4分钟每篇&#xff0c;也就是说真…

学习IB课程的宝藏网站,有需求选择

很多学习IB课程的同学都会觉得IB课程很难&#xff0c;平时作业很多根本没时间找资料&#xff0c;其实不用担心&#xff0c;关于IB课程学习的网站&#xff0c;小编已经帮大家整理好了&#xff0c;建议收藏起来&#xff01; 数学类IB网站&#xff1a;Revision Villag 数学对于会的…

Bard AI:训练过程中使用了多少数据?

近年来&#xff0c;人工智能取得了长足的进步&#xff0c;并在科技界掀起了波澜。 随着谷歌最近推出新的人工智能聊天机器人 Bard&#xff0c;人们对这项技术的工作原理以及训练它的内容感到好奇。 人工智能技术的关键组成部分之一是训练过程中使用的数据量&#xff0c;这有助于…

聊聊数据仓库是什么

随着数据通过各种方式创造了巨大价值&#xff0c;各领域的企业开始不断挖掘数据的作用&#xff0c;数据的重要性得到了社会各界的共同认可。像我们熟知的数据治理、数据管理、数据标准以及数据资产都是因为数据地位不断提升&#xff0c;企业开始重视起数据全生命周期流程&#…

整数规划、对偶理论、线性规划经典例题讲解

整数规划是一类要求问题的解中的全部或一部分变量为整数的数学规划&#xff0c;应用范围极其广泛。不仅在工业和工程设计和科学研究方面有许多应用&#xff0c;而且在计算机设计、系统可靠性和经济分析等方面也有新的应用。通过前面的学习&#xff0c;我们已经掌握了整数规划的…

Java测试——selenium具体操作

selenium的前置准备工作可以参考我之前的博客&#xff1a;Java测试——selenium的安装与使用教程 这篇博客讲解一下selenium的常见操作 先创建driver ChromeDriver driver new ChromeDriver();输入网址 driver.get("https://www.baidu.com");常见操作 查找元素…

[数据分析] 数据指标体系搭建

在数据分析的学习过程中&#xff0c;我们通常会要求掌握以下两点: 1.理解数据&#xff0c;懂得从数据中发现业务指标(学会如何去看懂数据) 2.使用相关指标去分析数据&#xff0c;同时使用多个指标去分析一个问题(了解常见的指标) 当我们拿到数据(通常以Excel或者数据库方式去…

机器学习评估指标的十个常见面试问题

评估指标是用于评估机器学习模型性能的定量指标。它们提供了一种系统和客观的方法来比较不同的模型并衡量它们在解决特定问题方面的成功程度。通过比较不同模型的结果并评估其性能可以对使用哪些模型、如何改进现有模型以及如何优化给定任务的性能做出正确的决定&#xff0c;所…