2024年鸿蒙最全数据结构与算法基础-(3)(1),2024年HarmonyOS鸿蒙阿里&腾讯&百度&字节校招面试汇总

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

目录

回顾💫

List 列表数据类型常用操作性能

Dict字典数据类型常用操作性能

P、NP、NPC、NP-hard问题详解

1. 多项式时间(Polynomial time)

2. 确定性算法与非确定性算法

确定性算法:

非确定性算法:

3. 规约/约化

4. P类问题、NP类问题、NPC问题

P类问题:

NP类问题:

NPC问题(NP-complete):

NP难问题:


6a78491801a74bbd8d932659b06e11db.gif#pic_center

回顾💫

“温故而知新”~

上回儿说到,什么是时间复杂度,空间复杂度,

以及变位词问题的四种解法,以及内置函数sorted和sort.()的内置函数拓展

**不记得的朋友可以点击🔗http://t.csdn.cn/04nTx**进行快速定位,接下来进行new knowledge 的学习

8073dea0e949457ca2f8122f2a74d451.png

后面我们会用来实现各种数据结构

通过运行试验来估计其各种操作运行时间数量级

137b732346bc4582b01787680ebff434.png

List 列表数据类型常用操作性能🍒

最常用的:按索引取值和赋值( v = a [i]–>取值操作, a [i] = v–>赋值操作)

由于 列表随机访问特性 , 这两个操作执行时间与列表大小无关 , 均为O(1)

另一个是列表增长, 可以选择append() 和  _add_() " + "

lst.append(v), 执行时间 O(1)

lst = lst + [V],列表中加一个列表, 执行时间是O(n+k),其中 k 是被加的列表长度

选择哪个方法来操作列表,决定了程序的性能

4种生成前n个整数列表的方法:

#首先是循环连接列表( + ) 方式生成
def test1():
    l = []
    for i in range(1000):
        l = l + [i]

#然后用append方法添加元素生成
def test2():
    l = []
    for i in range(1000):
        l.append(i)

#用列表推导式来生成
def test3():
    l = [i for i  in range(1000)]

#最后 利用 range函数 调用转成 列表
def test4():
    l = list(range(1000))

70c519c3377649178c88970b7da280dd.png

Dict字典数据类型常用操作性能🍌

f4bf1a5430e54267ae142c2714bab100.png

P、NP、NPC、NP-hard问题详解🫐

想要理解P问题、NP问题、NPC问题、NP-hard问题,需要先弄懂几个概念:

什么是多项式时间(inpolynomial多项式  time)?
什么是确定性算法?什么是非确定性算法?
什么是规约/约化?

1. 多项式时间(Polynomial time)🍈

时间复杂度是衡量算法执行效率的一个指标,它表示算法运行时间与问题规模之间的增长关系。通常用大O符号来表示。

常见的时间复杂度类型有:

  1. 常数阶 O(1)
  2. 对数阶 O(log n)
  3. 线性阶 O(n)
  4. 线性对数阶 O(n log n)
  5. 平方阶 O(n^2)
  6. 立方阶 O(n^3)
  7. 指数阶 O(2^n)
  8. 阶乘阶 O(n!)

  1. 常数时间复杂度 O(1):无论输入的数据规模如何变化,算法的执行时间都是恒定的                        示例:访问数组中固定下标的元素,或者执行单次的加减乘除运算等。
  2. 对数时间复杂度 O(log n):当输入规模增加时,算法执行时间相对于输入规模增加的比率不大。                                                                                                                                                    示例:二分查找算法。
  3. 线性时间复杂度 O(n):算法执行时间与输入规模是正比的。                                                            示例:遍历一次长度为 n 的数组,或者进行一次循环 从1到n 累加求和等。
  4. 平方时间复杂度 O(n^2):算法执行时间与输入规模平方成正比。                                                    示例:双重循环嵌套的算法,比如冒泡排序、插入排序等。
  5. 指数时间复杂度 O(2^n):算法执行时间的增长率与输入规模的指数成正比。                                  示例:穷举算法,比如求解最长公共子序列问题的暴力算法。

还有其他更高阶的时间复杂度,比如阶乘时间复杂度 O(n!),递归时间复杂度 O(2^n) 等,但是这些复杂度通常不会出现在实际应用中,因为它们的执行时间会随着输入规模的增加而急剧增长,算法的效率非常低下。

像 O(1),O(ln(n)),O(n^a) 等,我们把它叫做多项式级复杂度,因为它的规模n出现在底数的位置;另一种像是 O(a^n) 和 O(n!) 等,它是非多项式级的复杂度,其复杂度计算机往往不能承受。当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。

2. 确定性算法与非确定性算法🍑

确定性算法:

设A是求解问题B的一个解决算法,在算法的整个执行过程中,每一步都能得到一个确定的解,这样的算法就是确定性算法。

非确定性算法:

设A是求解问题B的一个解决算法,它将问题分解成两部分,分别为猜测阶段验证阶段,其中

  1. 猜测阶段:在这个阶段,对问题的一个特定的输入实例x产生一个任意字符串y,在算法的每一次运行时,y的值可能不同,因此,猜测以一种非确定的形式工作。
  2. 验证阶段:在这个阶段,用一个确定性算法(有限时间内)验证。                                       ①检查在猜测阶段产生的y是否是合适的形式,如果不是,则算法停下来并得到no;           ② 如果y是合适的形式,则验证它是否是问题的解,如果是,则算法停下来并得到yes,否则算法停下来并得到no。它是验证所猜测的解的正确性。

3. 规约/约化🍊

问题A可以约化为问题B,称为“问题A可规约为问题B”,可以理解为问题B的解一定就是问题A的解,因此解决A不会难于解决B。由此可知问题B的时间复杂度一定大于等于问题A。

规约就是选择一个文法规则:X→ABC,依次从栈顶弹出C、B、A,再将X压进栈。规范规约是文法中句子的一个最右推导的逆过程,而最左推导对应的是最右规约 。

再例如《算法导论》中有一个例子:现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以规约为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。

从规约的定义中我们看到,一个问题规约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断规约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。

4. P类问题、NP类问题、NPC问题、NP难问题🍍

P类问题:

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

715732880495)]
[外链图片转存中…(img-nhhroRE3-1715732880495)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值