算法学习(一):算法和数据结构入门

这个系列主要是记录我的算法学习的笔记和总结, 可能更新的会比较慢, 毕竟我的主线是前端技术学习嘛


什么是算法

算法 就如他的名字一般, 完整描述如何得到想要的结果结果的方法, 是一系列解决问题的清晰指令,

举个例子, 比如我们想要计算1+2+3+4+...+100的结果, 我们有很多种方法

  • 我们可以用最笨的方法,把他们一个一个加起来
  • 我们也可用比较聪明的方法, 把第一项和最后一项相加, 然后乘以100, 再除以2

这些为了得到结果所以使用的方法就是我们所说的算法

算法有如下特征:

  • 输入:一个算法必须有零个或以上输入量。
  • 输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
  • 明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地匹配要求或期望,通常要求实际运行结果是确定的。
  • 有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。
  • 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

什么是数据结构

就是数据的结构

这里很多同学一定会疑惑, 数据还有结构吗?那么我们来举例说明吧

假如我们现在想列出家里都有哪些人, 那么我们该怎么列呢?

家族成员

再假设我们想我们想描述一个队伍的排队顺序和长度, 我们一般这么表示


排队

再假设我们想表示从地点1到地点5的路线, 我们可以这么表示


路线

这三种表现形式就对应着三种不同的数据结构,我们把第一种叫, 第二种叫队列, 第三种叫, 除了这三种之外还以后很多数据结构, 看吧, 数据还是有结构的吧?


算法和数据结构的结合

一般来说是这样的:

我们要解决一个跟数据相关的问题
分析这个问题,想出对应的数据结构
分析数据结构,想出算法
数据结构和算法是互相依存、不可分开的, 比如当你学习完排序算法,就能了解常见的数据结构

算法大分类

分治法:把一个问题分区成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。
动态规划法:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。
贪婪算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。
线性规划法:自己google词条吧。
简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。
我们前端主要使用分治法——分而治之。


伪代码和流程图

伪代码

在学习算法的时候, 我个人推荐用伪代码作为设计算法的手段, 所谓的伪代码其实就是一种不拘泥于任何语言的一种你自创的语法, 主要作用是表达出算法的过程,这样的好处就是你不用去纠结语法细节, 完全把注意力集中在算法实现上

假设我用js类似的语法格式作为我伪代码的格式

自定义的条件控制语句

if( 满足x条件) {
  console.log(1)
} else if(满足y条件) {
  consloe.log(2)
}else {
  console.log(3)
}

自定义的循环语句

a=0
for(i=0; i<5; i++) {
  console.log(a)
  a++
}

一个最简单的例子

从正整数数组a中找出最小的数字, 打印出来

这个问题的思路如下:

  1. 我们假设数组的第一项为最小数字min
  2. 第二项与第一项比较, 如果第二项比第一项小, 就把第二项的数赋值给min, 如果第二项比第一项大, 那么min仍然为第一项
  3. 拿第三项和min比, 如果第三项比min小, 那min的值就是第三项的值, 如果第三项比min大, 那min值不变
  4. 以此类推, 直到最后一项与min比完
  5. 输出的min值就是数组中最小的值

代码如下

a = [23,29,39,49,59]
min = a[0]
index = 1
while(index < a.length) {
  if(a[index] < min) {
    min =  a[index]
  }
  index += 1
}
console.log(min)

流程图

简单来说流程图就是用图形的方式表达出程序执行的过程

如何画流程图

  1. 流程图的开始我们一般用一个椭圆的start或开始表示
  2. 用箭头连接每一条指令, 箭头的方向就是执行方向
  3. 普通语句我们用方框表示
  4. 分支我们用菱形表示, 并且在分支上标明分支条件
  5. 结束我们通常用一个椭圆的end或者结束表示

流程图的好处是直观的用图形表现是我们的思路, 用来帮助我们理清思路是最合适不过的了

从正整数数组a中找出最小的数字我们用流程图表示的话, 就是下面这个流程图

流程图

算法小试牛刀

上面说了那么多概念, 估计大家也都烦了, 那么我们就开始搞几个简单的排序算法吧,这里我们用冒泡排序把一个数组按顺序从小排到大

冒泡排序算法

QQ20180321-202310.gif

1.从数组的起始位置开始,将相邻的两个数比较,如果前一个比后一个大, 则交换两个数的位置, 如果前一个比后一个小, 则位置不动, 这样一轮比完后, 数组最后一个数一定是数组中最大的那一个
2.再次从数组起始位置按照上面的方法两两对比, 这次比到数组的倒数第二个位置, 这时候倒数第二个就是整个数组第二大的数
3.以此类推, 直到比到数组第一个位置为止, 这样数组就从小到大依次排列了!

冒泡排序动画

冒泡排序算法的代码

let a = [45,2,17,99,60]

let loopTimes = 1
let length = a.length - 1

while(loopTimes < a.length) {
  for(let i=0; i < length; i++) {
    if(a[i] > a[i+1]){
      let t=a[i]
      a[i] = a[i+1]
      a[i+1] = t
    }
  }
  length -= 1
  loopTimes += 1
}
console.log(a)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 648评论 0 0
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,073评论 0 12
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 2,252评论 0 3
  • 相聚半余月,再续千古缘。 此情留心头,照耀千万家。
    小龙禅拍阅读 229评论 0 3
  • 无聊的学习生涯仿佛被石子敲了脑袋,奋不顾身的爱情一时半会还不能实现,何不来次说走就走的旅行呢!我总是开窍太晚,好像...
    我本浪人z阅读 170评论 0 0