数据结构与算法基础-(2)

 🌈write in front🌈
🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
📝个人主页:Aileen_0v0🧸—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:Aileen_0v0🧸的数据结构与算法学习系列专栏🌸——CSDN博客
🗼我的格言:"没有罗马,那就自己创造罗马💫~"

目录

"时间复杂度"回顾

空间复杂度

“变位词”判断问题

解法1:逐字检查法

思路:

代码块: 

运行过程:​编辑

解法2:排序比较

思路:

​编辑 代码块:

运行过程:​编辑

解法3:暴力法

思路:​编辑

解法4:计数比较

思路:

​编辑

代码块:

运行过程: 

拓展 sort.() 和 sorted的区别

sort()和sorted()的区别

其他类型排序


"时间复杂度"回顾💯

常见时间复杂度

执行次数函数(
Asymptot i c Notation
)举例
阶(
Big-0 Notat i o n
)
非正式术语
12O(1)常数阶
2n+3O(n)线性阶
3n^2+2n+1O(n^2)平方阶
5log2n+20O(logn)对数阶
2n+3nlog2n+19O(nlogn)nlogn阶
6n^3+2n^2+3n+4O(n^3)立方阶
2^nO(2^n)指数阶

由图可知,所消耗的时间从小到大:

O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

下图表示常见的时间复杂度

空间复杂度💥


空间复杂度运行完一个程序所需内存的大小

利用程序的空间复杂度可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。

程序执行所需存储空间包括以下两部分。

(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间《常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等这部分的空间大小与算法有关

例如: 要判断某年是不是闰年,你可能会花一点心思来写一个算法,每给一个年份,就可以通过这个算法计算得到是否闰年的结果。
另外一种方法是,事先建立一个有 2050 个元素的数组,然后把所有的年份按下标的数字对应,如果是闰年,则此数组元素的值是 1,如果不是元素的值则为 0。

这样,所谓的判断某一年是否为闰年就变成了查找这个数组某一个元素的值的问题。

第一种方法相比起第二种来说很明显非常节省空间,但每一次查询都需要经过一系列的计算才能知道是否为闰年。

第二种方法虽然需要在内存里存储 2050 个元素的数组,但是每次查询只需要一次索引判断即可。

这就是通过一笔空间上的开销来换取计算时间开销的小技巧。到底哪一种方法好?其实还是要看你用在什么地方~~

一个算法所需的存储空间用 f(n)表示

S(n)=O(f(n))                          

n为问题的规模,S(n)表示空间复杂度

# 空间复杂度
def reserve(a,b):n=len(a)for i in range(n):b[i]=a[n-1-i]

上方的代码中,当程序调用 reserse()方法时,

要分配的内存空间包括: 引用 a、引用 b、局部变量n、局部变量i。因此 f(n)=4 ,4 为常量。

所以该算法的空间复杂度 S(n)=O(1)

空间复杂度的计算方式和时间复杂度类似

算法:独立解决问题的一种思想

大O数量级(大O记法):评判算法复杂度的指标

“变位词”判断问题⭐

“变位词”是指两个词之间存在组成字母的重新排列关系
如: heart和earth,python和typhon

解法1:逐字检查法🔥

思路:

代码块: 
def anagramSolution1(s1,s2):alist = list(s2)pos1 = 0stillOK = Truewhile pos1 < len(s1) and stillOK:pos2 = 0found = Falsewhile pos2 < len(alist) and not found:if s1[pos1] == alist[pos2]:found = Trueelse:pos2 = pos2 + 1if found:alist[pos2] = None  #找到就利用None打勾else:stillOK = Falsepos1 = pos1 + 1return stillOKprint(anagramSolution1("ad","ca"))
运行过程:

解法2:排序比较法🔥

思路:

 代码块:

def anagramSolution2(s1,s2):#转为列表alist1 = list(s1)alist2 = list(s2)#分别排序alist1.sort()alist2.sort()pos = 0matches = Truewhile pos < len(s1) and matches:#逐个对比if alist1[pos] == alist2[pos]:pos = pos + 1else:matches = Falsereturn matchesprint(anagramSolution2("abcde", "edcba"))

运行过程:

粗看上去,本算法只有一个循环,最多执行n次,数量级是O(n)

但循环前面的两个sort并不是无代价的~

排序算法采用不同的解决方案,其运行时间数量级差不多是0(n2)或者0(n log n),大过循环的O(n)

所以本算法时间主导的步骤是排序步骤
本算法的运行时间数量级就等于排序过程的数量级O(n log n)

python中的sorted()函数对字符串进行排序,判断是否两个字符串排序后相等来判断是否为变位词。

例如,判断字符串"race"和"care"是否为变位词:

str1 = "race"
str2 = "care"if sorted(str1) == sorted(str2):print("两个字符串是变位词")
else:print("两个字符串不是变位词")

def is_anagram(str1, str2):# 如果两个字符串长度不同,则它们不可能是变位词if len(str1) != len(str2):return False# 两个字符串排序后比较str1_sorted = sorted(str1)str2_sorted = sorted(str2)for i in range(len(str1)):if str1_sorted[i] != str2_sorted[i]:return Falsereturn True# 示例:
print(is_anagram("listen", "silent"))  # True
print(is_anagram("python", "java"))    # False

在上面的示例中,我们定义了一个名为 is_anagram 的函数,输入两个字符串 str1和 str2如果两个字符串的长度不同,则它们不可能是变位词,返回False。并使用Python的sorted函数将这两个字符串排序。对于两个已排序的字符串,我们使用for循环逐个比较它们的字符。如果有任何不相等的字符,则这两个字符串不是变位词如果所有字符都相等,则这两个字符串是变位词,返回True。 

解法3:暴力法🔥

(由于它不是一个好方法,所以了解即可)

思路:

解法4:计数比较法🔥

思路:

 

ord()函数:返回的是 字符的 Unicode值

将 对应字符的Unicode - a的Unicode 就能得到 每个字符变成 0 -  25的数字

代码块:

def anagraamSolution4(s1,s2):#计数器1c1 = [0] * 26#计数器2c2 = [0] * 26#对 s1 进行计数for i in range (len(s1)):pos = ord(s1[i]) - ord("a")c1[pos] = c1[pos] + 1#对 s2 进行计数for i in range (len(s2)):pos = ord(s2[i]) - ord("a")c2[pos] = c2[pos] + 1#进行每一位字符的比较j = 0stillOK = Truewhile j < 26 and stillOK:if c1[j] == c2[j]:j = j + 1else:stillOK = Falsereturn stillOK
print(anagraamSolution4("apple","pleap"))

运行过程: 

 

拓展 sort.() 和 sorted的区别🪄

sort()和sorted()的区别✨

接收 sort() 的返回值,可以发现是None

list1 = [1, 3, 2, 5]
list2 = list1.sort()
print(list2)

输出: 

None

 打印一下排序前、后的「内存地址」,可以发现 地址没有改变!

list1 = [1, 3, 2, 5]
print(id(list1))
list1.sort()
print(id(list1))

输出:

1465837605120
1465837605120

sort() 的设计思想就是「修改」原列表,而不是返回新的列表;
它不会创建新的列表,从而节省「效率」
当然,这也意味着原列表被修改了,使用时要留意这一点;
sorted() sort() 的扩展函数,可以对列表的元素排序,同时不会修改原列表

list1 = [1, 3, 2, 5]
list2 = sorted(list1)
print(list1)
print(list2)

输出:

[1, 3, 2, 5]
[1, 2, 3, 5]

从结果可以看到, sorted() 创建了新的列表,用来保存排序后的列表

其他类型排序✨

sort() 对列表排序,而 sorted() 能对可迭代对象排序;

所以,字符串、元组、字典等类型想排序,可以用 sorted().

str1 = "312"
print(sorted(str1))tuple1 = (5, 1, 3)
print(sorted(tuple1))dict1 = {"key1": 1, "key2": 2}
print(sorted(dict1))

输出:

['1', '2', '3']
[1, 3, 5]
['key1', 'key2']

从输出结果可以发现,字符串、元组、字典类型排序后,返回的是列表类型;并且字典只对键排序,不对值排序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch - 分布式搜索引擎底层实现——倒排索引

目录 一、ElasticSearch 1.1、ElasticSearch 是什么&#xff1f; 1.2、ElasticStack 是什么? 1.3、正向索引和倒排索引 1.3.1、正向索引 1.3.2、倒排索引 a&#xff09;倒排索引的创建过程&#xff1a; b&#xff09;倒排索引的查询过程&#xff1a; c&#xff09;分…

LeetCode讲解篇之347. 前 K 个高频元素

347. 前 K 个高频元素 文章目录 347. 前 K 个高频元素题目描述题解思路题解代码 题目描述 题解思路 根据数组频率倒序排序, 然后返回前k的个数据 题解代码 func topKFrequent(nums []int, k int) []int {m : make(map[int]int, 0)for i : len(nums) - 1; i > 0; i-- {m[n…

一拖三快充线(USB-C转三充)的解决方案--LDR6020P

DR6020P 是带有 3 组 6 路 DRP USB-C 及 PD 通信协议处理模块和 USB2.0 Device 功能的 16 位 RISC MCU&#xff0c;内置 8K16 位 MTP 程序存储器&#xff08;可烧录 1000 次&#xff09;&#xff0c;512 字节的数据存储器&#xff08;SRAM&#xff09;。内置 LDO 5V 输出&#…

滑动窗口9.23

1876.长度为3且各字符不同的子字符串 1876. 长度为三且各字符不同的子字符串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/?envTypelist&envId24zW97w8自写思路&#xff1a; 数组充当哈希表…

Mysql004:用户管理

前言&#xff1a;本章节讲解的是mysql中的用户管理&#xff0c;包括&#xff08;管理数据用户&#xff09;、&#xff08;控制数据库的访问权限&#xff09;。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

数字IC设计系列----单端口RAM、双端口RAM

一、单端口RAM原理及实现 1.1、概念/原理 在内存空间中开辟出一段固定大小的内存用于存储数据&#xff0c;每一个数据所占的bit位称之为位宽&#xff0c;这段内存空间中数据的总数称之为深度。例如reg [7:0] mem [255:0]&#xff0c;这段内存空间中每一个数据的位宽为8bit&am…

Nuxt 菜鸟入门学习笔记:路由

文章目录 路由 Routing页面 Pages导航 Navigation路由参数 Route Parameters路由中间件 Route Middleware路由验证 Route Validation Nuxt 官网地址&#xff1a; https://nuxt.com/ 路由 Routing Nuxt 的一个核心功能是文件系统路由器。pages/目录下的每个 Vue 文件都会创建一…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️…

【Unity3D赛车游戏制作】开始界面场景搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

大模型的最大bug,回答正确率几乎为零,GPT到Llama无一幸免

目录 前言 1.名字和描述颠倒一下&#xff0c;大模型就糊涂了 2.实验及结果 3.未来展望 前言 大模型的逻辑&#xff1f;不存在的。 我让 GPT-3 和 Llama 学会一个简单的知识&#xff1a;A 就是 B&#xff0c;然后反过来问 B 是什么&#xff0c;结果发现 AI 回答的正确率竟然是…

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样&#xff0c;它是独立安装和部署的&#xff0c;下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

2024年考研教育专业的教育综合考试大纲、样题和往年真题

根据教育部通知&#xff0c;2024年全国硕士研究生招生考试初试定于2023年12月23日至24日&#xff0c;即我们说的2024年考研时间为12月23-24日。距离现在只剩下3个月不到的时间&#xff0c;那么如何让我们在最后三个月内的复习和备考有效且高效呢&#xff1f; 结合很多清北复交研…

湖南麒麟两种修复硬盘方式

1、背景介绍 目前X86平台采用湖南麒麟3.3-3B系统&#xff0c;当遇到文件系统损坏时&#xff0c;可分下面两种情况进行文件系统修复 2、紧急模式下的修复 板子能进入系统&#xff0c;但是进入的是紧急模式&#xff0c;类似下面这种 此时可以直接输入修复命令进行系统修复 xf…

win11 允许使用脚本Set-ExecutionPolicy

目录 Set-ExecutionPolicy RemoteSigned notepad.exe $PROFILE Set-ExecutionPolicy RemoteSigned Set-ExecutionPolicy RemoteSigned 如果报错&#xff0c;执行&#xff1a; Set-ExecutionPolicy -Scope CurrentUser 然后就会提示我们输入&#xff0c;我们把刚刚的 Remot…

C语言每日一题(10):无人生还

文章主题&#xff1a;无人生还&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&#x1f…

Ubuntu 安装 CUDA 与 OPENCL

前言&#xff1a;最近需要做一些GPU并行计算&#xff0c;因而入坑CUDA和OPENCL&#xff0c;两者都有用到一些&#xff0c;刚好有点时间&#xff0c;同时记录一些学习过程&#xff0c;排掉一些坑&#xff0c;这篇是环境安装篇&#xff0c;基本跟着走就没什么问题&#xff0c;环境…

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础 第21章 Qt Quick Controls开发基础21.1 Qt Quick Controls概述21.1.1 第一个Qt Quick Controls程序21.1.2 Qt Quick窗体应用程序的构成 21.2 Qt Quick控件21.2.1 概述21.2.2 基本控件21.2.3 高级控件21.2.4 样式定制 2…

基于MUSIC算法的二维超声波成像matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基本原理 4.2、数学公式 4.3、实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................…

比特币的蒙提霍尔问题

把钱放在嘴边 我们在比特币上建立了蒙提霍尔问题模拟。 如果您知道概率谜题的正确答案&#xff0c;不仅炫耀您的数学技能&#xff0c;还会获得金钱奖励。 它完全无需信任地在链上运行。 蒙提霍尔问题 蒙提霍尔问题&#xff08;三门问题&#xff09;是一个以蒙提霍尔命名的概率…

力扣-234.回文链表

Idea 用一个数组或者字符串将链表中的值依次存入&#xff0c;然后利用数组遍历方法比较双端元素 AC Code class Solution { public:bool isPalindrome(ListNode* head) {string s "";ListNode* p head;while(p ! nullptr){s.append(to_string(p->val));p p-&g…