本书看完,对常见的数据结构与算法从概念上有了更深入的理解。

书中关于数组、栈和队列、链表、字典、散列、集合、二叉树、图、排序、检索、动态规划、贪心算法都有详细的介绍。算是一本不错的学习书籍。

栈和队列:都可以通过数组来模拟。栈的规则是先进后出,队列的规则是先进先出

链表:有双向与单向链表之分,默认有一个头指针,指向下一个节点,就像链条一样。

数组 vs 链表:

  • 数组查找速度快:数组能够通过索引快速找到一个元素,高效快速。而链表没有索引,查找不是很便捷。
  • 链表增加、删除性能高:数组增加、删除一个元素,后面的元素都需要移动一个位置,数据量大时,改前面的数据,很耗性能。而链表只需改动节点的指向索引,非常高效。

字典:简单理解就是key/value的键值对存储的对象。

散列:基于数组设计,长度预定。借助散列函数将每个键值映射为一个唯一的数组索引。

集合:js中的map、set。

二叉树:非线性的数据结构,以分层的方式存储。用来存储具有层级关系的数据。比如文件系统。具有根节点、左子树、右子树、叶子节点。树的层数就是树的深度。树的遍历:

  • 中序:按照节点上的键值,升序访问所有节点
  • 先序:先访问根节点,然后以同样的方式访问左子树和右子树。
  • 后序:先访问叶子节点,从左子树到右子树,再到根节点。

图:由边的集合及顶点的集合组成。地图就是一种图。如果一个图的顶点是有序的,则称之为有向图,反之为无向图。

常见的排序:冒泡排序、选择排序、插入排序

高级排序:希尔排序、归并排序。

检索:二分查找算法,比排序查找算法高效。

动态规划

使用递归方案能解决的问题,都能够使用动态规划技巧来解决。

动态规划:解决相似子问题,并保存子问题的解,通过子问题的解从而解决整个问题。子问题的解通常存储在数组中便于访问

动态规划,听过它的鼎鼎大名,但一直没深入了解过。

书中的例子:

1.计算裴波那契数列

斐波那契数列:0,1,1,2,3,5,8,13...

该序列是由前两项数值相加而成的

递归实现:效率低,有太多值在递归调用中被重新计算。

function recurFib (n) {
if (n < 2) {
return n;
}
return recurFib(n - 1) + recurFib(n - 2);
}

动态规划实现:将数组的每个元素赋值为前两个元素之和,循环结束,最后一个元素值即为最终计算得到的斐波那契数值

function dynFib(n) {
var val = [];
for (var i = 0; i <= n; i++) { // 0 - n:含 n+1 个
val[i] = 0;
} if (n == 1 || n == 2) {
return 1;
}
val[1] = 1;
val[2] = 2;
for (var i = 3; i <= n; i++) {
val[3] = val[i-1] + val[i-2];
}
return val[n-1];
}

迭代实现:不保存中间结果

function iterFib (n) {
var last = 1;
var nextLast = 1;
var result = 1;
for (var i = 2; i < n; i++) {
result = last + nextLast;
nextLast = last;
last = result;
}
return result;
}

2.寻找两个字符串的最长公共子串

动态规划:使用一个二维数组存储两个字符串相同位置的字符比较结果。初始数组每一个元素被设置为0,每次在这两个数组的相同位置发现了匹配,就将该数组对应行和列的元素加1,否则保持为0

function lcs (word1, word2) {
// 初始化二维数组,每项为0
var max = 0;
var index = 0;
var lcsarr = new Array(word1.length + 1);
for (var i = 0; i <= word1.length + 1; i++) {
lcsarr[i] = new Array(word2.length + 1);
for (var j = 0; j <= word2.length + 1; j++) {
lcsarr[i][j] = 0;
}
} // 保存字符匹配的记录,如果两个字符串相应位置的字符进行了匹配,当前数组元素的值将被设置为前一次循环中数组元素保存的值加1,最后如果变量max的值比现在存储在数组中的当前元素小,max的值将被赋值给这个元素,变量index的值将被设置为i的当前值。这两个变量将在函数的最后一部分用于确定从哪里开始获取最长公共子串。
for (var i = 0; i <= word1.length; i++) {
for (var j = 0; j <= word2.length; j++) {
if (i == 0 || j == 0) {
lcsarr[i][j] = 0;
} else {
if (word1[i - 1] == word2[j - 1]) {
lcsarr[i][j] = lcsarr[i - 1][j - 1] + 1;
} else {
lcsarr[i][j] = 0;
}
}
if (max < lcsarr[i][j]) {
max = lcsarr[i][j];
index = i;
}
}
} // 确认从哪里开始构建这个最长公共子串。以变量index减去变量max的差值作为起始点,以变量max的值作为终点。
var str = '';
if (max == 0) {
return '';
} else {
for (var i = index - max; i <= max; i++) {
str += word2[i];
}
return str;
}
} console.log(lcs('raven', 'havoc')); // av

关于第二部分,记录字符串匹配结果,可以优化,减少遍历次数

 for (var i = 1; i <= word1.length; i++) {
for (var j = 1; j <= word2.length; j++) {
if (word1[i - 1] == word2[j - 1]) {
lcsarr[i][j] = lcsarr[i - 1][j - 1] + 1;
}
if (max < lcsarr[i][j]) {
max = lcsarr[i][j];
index = i;
}
}
}

书中还有关于如何用递归与动态规划解决背包问题,甚至用贪心算法解决部分背包问题。

背包问题:有一个保险箱,保险箱中的物品规格和价值不同。你需要将保险箱中的宝物放入一个你的背包,希望背包装进的宝贝价值最大。如:保险箱中有5件物品,尺寸:3,4,7,8,9,价值:4,5,10,11,13,背包的容积为16。最优解是:选取第三件和第五件,总尺寸是16,总价值是23。

如果感兴趣的,可以翻开此书看看。

读后感:数据结构与算法JavaScript描述的更多相关文章

  1. 《数据结构与算法JavaScript描述》

    <数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...

  2. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  3. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  4. 列表的实现-----数据结构与算法JavaScript描述 第三章

    实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...

  5. 《数据结构与算法JavaScript描述》中的一处错误

    最近在看<数据结构与算法JavaScript描述>这本书,看到选择排序这部分时,发现一个比较大的错误. 原书的选择排序算法是这样的: function selectionSort() { ...

  6. 数据结构与算法 Javascript描述

    数据结构与算法系列主要记录<数据结构与算法 Javascript描述>学习心得

  7. 读《数据结构与算法 Javascript描述》 | 平淡无奇

    “平淡无奇”,一句话总结. 当初买这本书的原因,在意的是有没有什么令人惊喜的东西,特别是针对Javascript代码的奇思妙想,所以就买下了这本书. 在买的几本书里面,最先看的也是这一本,但看起目录就 ...

  8. 数据结构与算法JavaScript描述——使用队列

    1.使用队列:方块舞的舞伴分配问题 前面我们提到过,经常用队列模拟排队的人.下面我们使用队列来模拟跳方块舞的人.当 男男女女来到舞池,他们按照自己的性别排成两队.当舞池中有地方空出来时,选两个队 列中 ...

  9. 数据结构与算法JavaScript描述——链表

    1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要 ...

随机推荐

  1. webpack学习_资源管理(loader)

    webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件 引入资源步骤 Step1:安装你需要的loader  Step2:在 module配 ...

  2. spf13-vim 显示neocomplete requires ...th Lua support

    安装spf13-vim的时候下载了许多插件,neocomplete应该是比较重要的一个,毕竟自动补全.但是在使用时却一直有:neocomplete requires ...th Lua support ...

  3. 格式化字符串漏洞 format string exploit(一)

    本文系原创,转载请说明出处 本文为基于CTF WIKI的PWN学习 0x00 格式化字符串原理 先附一张经典的图,如下 其栈上布局如下: some value 3.14 123456 addr of ...

  4. Linux Bash之正则表达式

    首先注意:正则表达式与通配符是完全不同的概念.通配符(wildcard)代表的是 Bash 操作接口的一个功能,而正则表达式是一种字符串处理的表示方式,一定要区分开来. 正则表达式(Regular E ...

  5. Vue之使用JsonView来展示Json树

    前两天干活儿有个需求,在前端需要展示可折叠的Json树,供开发人员查看,这里采用JsonView组件来实现,它是一款用于展示Json的Vue组件,支持大体积的Json文件快速解析渲染,下面记录一下实现 ...

  6. Golang 入门系列(十二)ORM框架gorm

    之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...

  7. alibaba/flutter_boost

    flutterBoost使用笔记 新一代Flutter-Native混合解决方案. FlutterBoost是一个Flutter插件,它可以轻松地为现有原生应用程序提供Flutter混合集成方案.Fl ...

  8. 新手Linux之路之Deepin

    用了很久的Window,心血来潮想换个系统,于是就开始踩坑Linux之路. 系统为deepin 首先基本的 设置root密码 $:sudo passwd root [sudo] password fo ...

  9. 删除列表中重复元素以及求list中元素个数

    Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...

  10. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...