小肥柴慢慢手写数据结构(0-1 基础知识)

小肥柴慢慢手写数据结构(0-1 基础知识)

目录

0-1 啥叫数据结构

(1) 个人的见解

对特定问题设计好的代码工具,使用这些工具不仅能帮助人们减少重复编码的时间,还能灵活的组合去解决很多实际生产生活中的计算机领域问题。

(2)大师的见解

<1>《计算机程序设计艺术(第1卷)》(里面换了一个名词“信息结构”,本意是一致的):“计算机程序通常都是对一些信息表进行操作。在大多数情况下,这些表并不仅仅是杂乱无章的数值集团;它们含有数据元素之间的重要结构关系”;“为了合理地使用一台计算机,我们需要理解存在于数据内的结构关系,以及在一台计算机内表示和操作这样的结构的基本技术”。
<2> 《数据结构与算法分析:C语言描述》:数据结构主要研究组织大量数据的方法,而算法分析则是对算法运行时间的评估。

个人十分认可《计算机程序设计艺术(第1卷)》中的描述,因为它直接点明了what-why-how中的前两项,特别是“为什么咱们计算机大类专业的同学(或者807/808)必须要学习《数据结构》和《算法》这两个项目的相关课程”这个核心问题的源头。

(3)很多教科书的解释

数据结构是相互之间存在一种或者多种特定关系的数据元素的集合。

化繁为简是咱们学习的目的,数据结构就是面向问题预研的一种有效编程工具/编程模式,属于前人智慧的结晶,咱们再学习的时候只要做到(1)自己能独立造出来类似工具;(2)能够熟练掌握这些工具使用,并根据应用场景灵活挑选合适的不同种类的工具即可;被那么多概念没用的,不过记一下祖师爷/大师傅们的论断还是很有用的。

0-2 啥叫算法

(1)个人的见解

1)算法就是针对特定问题或者某一类相似问题给出的一套解决策略,如果这些策略有很强的规律性,那么它必然可以总结升级为一套通用方法,即大家公认的概念——“算法”。
2)且算法分析就是学习一套如何衡量算法性能优劣的评判标准和数学工具。

举个例子:学习编程入门的时候必然有一个绕不过去的案例:求 sum = 1 + 2 + … + 99 + 100 = ?

一般写法:

forint i= 1; i <= 100; i++)
   sum += i;

这个偷懒的写法我认为够不上算法,真正的算法就是大家都学过的等差数列求和

sum = (n + 1) * n / 2;

只有简化了计算步骤、提高了计算效率(更短的运行时间、更少的使用存储空间)才能配得上“算法”这个名头,特别对哪些问题规模很大,限制条件复杂的问题来讲。

(2)大师的见解

<1> 《数据结构与算法分析:C语言描述》:“算法是为求解一个问题需要遵循的、被清楚滴指定的简单指令的集合”。
<2> 《算法导论》:“算法也就是一系列的将输入转换为输出的计算步骤”;“一个算法还可以被看作是用来解决一个良定义计算问题的工具”;“算法可以用自然语言或者一段计算机程序或者一种硬件设计来说明,唯一的一个要求就是该种说明必须给出一个对计算过程的精准描述”。
<3>《算法(第4版)》:“我们用算法这个词来描述一种有限、确定、有效的并适合用计算机程序来实现的解决问题的方法”。
<4> 《计算机程序设计艺术(第1卷)》:“一个算法只不过是一组有穷的规则,这些规则给出求解特定类型问题的运算序列,但除此之外,一个算法还有五个重要特征:1)有限性;2)确定性;3)输入;4)输出;5)可执行”。

觉得最后一种说法是最精准的,它给出了有限具体的规则。

【注意】很多动不动就把 “程序 = 数据 + 算法” 放在嘴边的朋友,一般情况下对数据/算法的理解大概率是不好描述的。

【那么】咱们本科生如果学习《数据结构与算法》这门课,到底应该怎么学呢?我给出一点点个人的建议:
(1)重视算法/数据结构原理的描述和理解;
(2)在完成(1)的基础上,踏踏实实的沿用参考教材(黑皮书),尽量依靠自己完成对应(1)的编码实现;
(3)不要过于纠结XX数据结构是如何实现的,差不多能自己写出来后,就应该将更多的精力投入到与这些数据结构相关的问题求解中,只有用到、用对了才算是真的懂;
(4)不要太过于纠结算法理论部分的研究,等有闲暇时光了,慢慢的找对应的辅助教程一点一点的磨《算法导论》和网上的算法OJ题;
(5)单纯脱离数据结构学习算法或者摒弃算法单学数据结构都是不合适的,还是那句话“万事适度”。

0-3 分析的数学基础

咱们先看看参考教材[1]中的描述,因为它十分简练;最后再给出挑选过的有意义的学习链接。

14个算法分析常用的渐进符号

目的:“在描述(运行时间的)函数间建立一种相对的级别”。 T ( n ) T(n) T(n) f ( n ) f(n) f(n) g ( n ) g(n) g(n) h ( n ) h(n) h(n) p ( n ) p(n) p(n)代表运行时间函数:

定义1:如果存在正常数 c c c n 0 n_0 n0使得当 N ⩾ n 0 N\geqslant n_0 Nn0 T ( N ) ⩽ c f ( N ) T(N)\leqslant cf(N) T(N)cf(N),则即为 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))

即算法运行的最坏情况,通常称 f ( N ) f(N) f(N) T ( N ) T(N) T(N)的“上界”(upper bound)。

定义2:如果存在正常数 c c c n 0 n_0 n0使得当 N ⩽ n 0 N\leqslant n_0 Nn0 T ( N ) ⩾ c g ( N ) T(N)\geqslant cg(N) T(N)cg(N),则即为 T ( N ) = Ω ( g ( N ) ) T(N)=\Omega(g(N)) T(N)=Ω(g(N))

即算法运行的最好情况,通常称 g ( N ) g(N) g(N) T ( N ) T(N) T(N)的“下界”(lower bound)。

定义3:当且仅当 T ( N ) = O ( h ( N ) ) T(N)=O(h(N)) T(N)=O(h(N)) T ( n ) = Ω ( h ( N ) ) T(n)=\Omega(h(N)) T(n)=Ω(h(N))时, T ( n ) = Θ ( h ( N ) ) T(n)=\Theta(h(N)) T(n)=Θ(h(N))

即上下界一致,能够准确估计算法的运行效率,相比上界/下界更加严密

定义4:如果 T ( N ) = O ( p ( N ) ) T(N)=O(p(N)) T(N)=O(p(N)) T ( N ) ≠ Θ ( p ( N ) ) T(N)\neq\Theta(p(N)) T(N)=Θ(p(N))时, T ( n ) = o ( h ( N ) ) T(n)=o(h(N)) T(n)=o(h(N))

2. 相关法则

法则1:如果 T 1 ( N ) = O ( f ( N ) ) T_1(N)=O(f(N)) T1(N)=O(f(N)) T 2 ( N ) = O ( g ( N ) ) T_2(N)=O(g(N)) T2(N)=O(g(N)),那么
(a) T 1 ( N ) + T 2 ( N ) = m a x ( O ( f ( N ) ) , O ( g ( N ) ) ) T_1(N)+ T_2(N)=max(O(f(N)), O(g(N))) T1(N)+T2(N)=max(O(f(N)),O(g(N)))
(b) T 1 ( N ) ∗ T 2 ( N ) = O ( f ( N ) ∗ g ( N ) ) T_1(N)* T_2(N)=O(f(N) * g(N)) T1(N)T2(N)=O(f(N)g(N))

法则2:如果 T ( N ) T(N) T(N)是一个 k k k次多项式,则 T ( N ) = Θ ( N k ) T(N)=\Theta(N^k) T(N)=Θ(Nk)

法则3:对任意常数 k k k l o g k N = O ( N ) log^kN=O(N) logkN=O(N),这意味着指数增长很慢

3.注意事项

<1> 没有所谓的 f ( N ) ⩽ O ( g ( N ) ) f(N)\leqslant O(g(N)) f(N)O(g(N)),因为此时定义已经隐含了不等式了。

所以在做算法分析的时候注意描述。

<2> 能够通过计算极限 lim ⁡ n → ∞ f ( N ) / g ( N ) \lim_{n \to \infty}f(N)/g(N) limnf(N)/g(N)来确定两函数 f ( N ) f(N) f(N) g ( N ) g(N) g(N)的相对增长率,必要时可以用洛必达法则。

于是我们对4个渐进符号的理解还能更进一步:

极限为0,意味着 f ( N ) = o ( g ( N ) ) f(N)=o(g(N)) f(N)=o(g(N))

极限为 c ≠ 0 c\neq 0 c=0, 意味着 f ( N ) = Θ ( g ( N ) ) f(N)=\Theta(g(N)) f(N)=Θ(g(N))

极限为 ∞ \infty , 意味着 g ( N ) = Θ ( f ( N ) ) g(N)=\Theta(f(N)) g(N)=Θ(f(N))

极限摆动,意味着两者无关

4.渐进符号的计算训练拓展阅读资料

具体的渐进符号分析和计算训练参考黑皮书和下面的链接:
(1)【数据结构】一篇文章带你彻底吃透·算法复杂度
(2)03.预备知识:算法的复杂度分析
【另外】考研的同学也可以去搜索王道考研的408真题做训练。

0-4 参考书籍

[1] 《数据结构与算法分析:C语言描述》
[2] 《算法导论》
[3] 《算法(第4版)》
[4] 《计算机程序设计艺术(第1卷)》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值