关于新坑和旧坑的说明

我又开了一个新的坑,迫于近期一些方面的压力,我又把数据结构和算法这个东西捡起来了,至于之前Clojure学习笔记系列的坑,咳咳,虽然还会更新下去,但是估计会延后很多了,因为学了Clojure蛮久的时间了,没有太多的实践机会,也没有对Clojure理解的足够深,因此这个系列估计会稍微放一放,等我理解足够深刻了在继续下去(对不起,还是因为懒XD)。

什么是算法

算法,这个东西其实是思路的体现,也可以说是问题的解决方案。相信大家也都看到过这句话:

程序=算法+数据结构

虽然这么说或许不够准确,但是算法对于程序本身而言意义是十分重大的。也是影响程序性能的一个关键因素。大多时候算法都是一个由实际问题转化而成的数学模型,因此,像写出一个好的算法的话首先要能充分理解问题,然后就是将问题转化成一个高效的数学模型。所以说啊,学好数学还是很关键滴~

什么是数据结构

数据结构是承载数据的(逻辑结构+存储结构)的总和,逻辑结构体现了数据元素之间的逻辑关系和元素自身的逻辑特性,而存储结构则是数据元素在存储设备上的存在形式。同时,存储结构也是逻辑结构在物理设备上的体现,存储的方式在一定程度上体现了数据元素之间的逻辑关系。

一些概念的笔记

这部分算是一些基本概念的笔记,考试专用哦XD,虽然没什么太大的用处,但是也体现了数据结构和算法的一些根本原则,对于初学者而言还是有必要了解一下。

  1. 算法是对特定问题求解步骤的一种描述,是指令的有限序列
  2. 算法的五个重要特性:输入、输出、确定性、有穷性、可行性
  3. “好”算法的五个特性:正确性、健壮性、可理解性、抽象分级、高效性
  4. 算法的描述方法:自然语言、流程图、程序设计语言、伪代码
  5. 时间复杂度和空间复杂度

这里简单地解释一下其中可能有迷惑的一些概念。

  1. 确定性:简单来说就是算法在不改变参数的前提下,其结果是确定的,不会变化的。相同的输入一定带来相同的输出。
  2. 有穷性:算法一定是可以结束的,这里指的是实际应用场景下而非算法结果本身(比如我的算法是产生一个无限的素数队列,但是我实际只需要截取前几位或固定位数,那么对于我而言算法就是有穷的)。
  3. 抽象分级:简单来说就是对算法不同部分的划分,哪一部分的算法是用来做什么的,其结果又用于哪个部分中作为参数。算法是一个相对整体的概念,但是中间的过程需要做出分割以便其他人能够理解和修改。
  4. 流程图和伪代码:这个意思我就不解释了,但是流程图和伪代码应该多去学习和理解,尤其是流程图,在工作之后很多时候是个很好的工具,而伪代码则是在忽略语法细节时最好的代码表现形式(其实就是忘了这里咋写了,然后大概写一下,滑稽XD)。
  5. 时间复杂度和空间复杂度:现在是一个硬件过剩的时代,空间复杂度往往是被大家忽略的一点,很多时候甚至会拿空间换时间,所以说时间复杂度的优化往往是性能提升的重头戏。但是!空间复杂度在整体设计上其实是很关键的一环,优秀的设计能大大缓解存储资源吃紧,提升程序效率(扩容啊啥的设计的烂的话太要命了)。还有,时间复杂度的分析要好好学哦,这里就不多说了,但是考试会考到~

几种算法的设计思路

  1. 蛮力法:采用一定策略依次处理求解问题的所有数据,即遍历数据集的方式,通常性能较低,用于处理较为基本的问题。
  2. 分治法:将问题分解为更小的规模然后各个击破,最后合并所有子模式的结果。如二叉树的遍历,深度优先遍历,快速排序等。
  3. 减治法:将问题分解为更小规模的问题,只需要解决其中一个小规模问题即可获得结果,无需合并所有子模式的结果。如插入排序,拓扑排序。
  4. 贪心法:将问题分解为一系列简单局部最优选择,每一步选择都是对当前解的扩展。如哈夫曼算法,Prim算法等。
  5. 动态规划法:将问题分解成若干子问题,但是子问题间并非相互独立,根据子问题间的关系动态规划函数。如FLOYD算法。

本篇结语

这一篇只是一篇引子,你可以当我又水了一篇文章,哈哈~不过,对于初学算法和数据结构的人而言,最初的认识往往是最重要的,对知识有一个完整的认识非常重要,可以让人更为明确所学的东西是什么,有什么,包含哪些内容,学习的目标或者最终达成的效果是什么,我要不要学etc. 这些其实都能从一个整体的概述中获取到。平时读书也是一样,先读一下序,看看作者或者其他人对于书的整体内容的认知是什么样的,可以迅速帮你确认这是不是你想看的内容。

后续内容说明

如果大佬看到篇文章可以尽情吐槽我,因为确实菜啊,毕业后好多知识都还给老师了,还是从最基础的开始学习。也是帮助刚开始进行学习这些的孩纸,我会把学校的教材从头到尾捋一遍,当然会根据不同的内容进行整理哒~也希望能帮助到看到这篇文章的萌新们XD