Movatterモバイル変換


[0]ホーム

URL:


登录/注册
下载豆瓣客户端
豆瓣6.0 全新发布×

豆瓣

扫码直接下载

iPhone·Android
豆瓣读书
搜索:

《算法图解》的原文摘录

  • 大O表示法(稍后介绍)讨论运行时间时, log指的都是log2。使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。 大O表示法让你能够比较操作数,它指出了算法运行时间的增速。 (查看原文)
    villim2017-09-01 11:24:38
    —— 引自章节:大O表示法
  • 下面按从快到慢的顺序列出了你经常会遇到的5种大O运行时间。 O(log n),也叫对数时间,这样的算法包括二分查找。 O(n),也叫线性时间,这样的算法包括简单查找。 O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。 O(n2),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。 O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。 (查看原文)
    villim2017-09-01 11:24:38
    —— 引自章节:大O表示法
  • 当前,我们获得的主要启示如下 算法的速度指的并非时间,而是操作数的增速。 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。 算法的运行时间用大O表示法表示。 O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。 (查看原文)
    villim2017-09-01 11:24:38
    —— 引自章节:大O表示法
  • 'use strict'; function binary_search(list, item) { let low = 0; let high = list.length - 1; while (low <= high) { let mid = Math.floor((low + high) / 2); let guess = list[mid]; if (guess === item) { return mid; } if (guess > item) { high = mid - 1; } else { low = mid + 1; } } return null;} const my_list = [1, 3, 5, 7, 9]; console.log(binary_search(my_list, 3)); // 1console.log(binary_search(my_list, -1)); // null <?phpfunction binarySearch($needle, $array) { $low = 0; $high = count($array) - 1; while ($low <= $high) { $middle = floor(($low + $high) / 2); if ($array[$middle] == $needle) { return $middle; } if ($array[$middle] > $needle) { $high = $middle - 1; } else { $low = $middle + 1; } } return null;}$array = [1, 3, 5, 7, 9];echo binarySearch(3, $array... (查看原文)
    2018-04-16 22:19:43
    —— 引自章节:第1章 算法简介 code
  • 'use strict';// Selection Sort - O(n^2)// Parameter:// 1. random array // 1. Finds the smallest value in an arrayfunction findSmallestIndex(array) { var smallestElement = array[0]; // Stores the smallest value var smallestIndex = 0; // Stores the index of the smallest value for (var i = 0; i < array.length; i++) { if (array[i] < smallestElement) { smallestElement = array[i]; smallestIndex = i; } } return smallestIndex;} // 2. Sort the arrayfunction selectionSort(array) { var sortedArray = []; var length = array.length; for (var i = 0; i < length; i++) { // Finds the smallest element in the array var smallestIndex = findSmallestIndex(array); // Adds the smallest element to new array sortedArray.push(array.splice(smallestIndex, 1)[0]); } return sortedArray;} console.log... (查看原文)
    2018-04-16 22:39:56
    —— 引自章节:第2章 选择排序
  • 我很喜欢Leigh Caldwell在Stack Overflow上说的一句话: “如果使用循环, 程序的性能可能更高; 如果使用递归, 程序可能更容易理解。 如何选择要看什么对你来说更重要。 ” (查看原文)
    2018-04-16 23:37:33
    —— 引自章节:3.1
  • 编写递归函数时, 必须告诉它何时停止递归。 正因为如此, 每个递归函数都有两部分: 基线条件 ( base case) 和递归条件 ( recursivecase) 。 递归条件指的是函数调用自己, 而基线条件则指的是函数不再调用自己, 从而避免形成无限循环。 (查看原文)
    2018-04-16 23:41:21
    —— 引自章节:3.2
  • 使用栈虽然很方便, 但是也要付出代价: 存储详尽的信息可能占用大量的内存。 每个函数调用都要占用一定的内存, 如果栈很高, 就意味着计算机存储了大量函数调用的信息。 在这种情况下, 你有两种选择。重新编写代码, 转而使用循环。使用尾递归 。 这是一个高级递归主题, 不在本书的讨论范围内。另外, 并非所有的语言都支持尾递归 递归指的是调用自己的函数。每个递归函数都有两个条件: 基线条件和递归条件。栈有两种操作: 压入和弹出。所有函数调用都进入调用栈。调用栈可能很长, 这将占用大量的内存。 (查看原文)
    2018-04-16 23:50:55
    —— 引自章节:3.4 小结 
  • 刚才你就打造了一个“Maggie”! 你结合使用散列函数和数组创建了一种被称为散列表 ( hash table) 的数据结构。 散列表是你学习的第一种包含额外逻辑的数据结构。 数组和链表都被直接映射到内存, 但散列表更复杂, 它使用散列函数来确定元素的存储位置。在你将学习的复杂数据结构中, 散列表可能是最有用的, 也被称为散列映射、 映射、 字典和关联数组。 散列表的速度很快! 还记得第2章关于数组和链表的讨论吗? 你可以立即获取数组中的元素, 而散列表也使用数组来存储数据, 因此其获取元素的速度与数组一样快。 (查看原文)
    2018-04-17 16:47:37
    —— 引自章节:5.1
  • 散列表是一种功能强大的数据结构, 其操作速度快, 还能让你以不同的方式创建数据模型。 你可能很快会发现自己经常在使用它。你可以结合散列函数和数组来创建散列表。冲突很糟糕, 你应使用可以最大限度减少冲突的散列函数。散列表的查找、 插入和删除速度都非常快。散列表适合用于仿真映射关系。一旦填装因子超过0.7, 就该调整散列表的长度。散列表可用于缓存数据( 例如, 在Web服务器上) 。散列表非常适合用于防止重复。 (查看原文)
    2018-04-17 17:00:51
    —— 引自章节:5.4-5.5
  • 广度优先搜索指出是否有从A到B的路径。如果有, 广度优先搜索将找出最短路径。面临类似于寻找最短路径的问题时, 可尝试使用图来创建模型, 再使用广度优先搜索来解决问题。有向图中的边为箭头, 箭头的方向指定了关系的方向, 例如,rama→adit表示rama欠adit钱。无向图中的边不带箭头, 其中的关系是双向的, 例如, ross - rachel表示“ross与rachel约会, 而rachel也与ross约会”。队列是先进先出( FIFO) 的。栈是后进先出( LIFO) 的。你需要按加入顺序检查搜索列表中的人, 否则找到的就不是最短路径, 因此搜索列表必须是队列。对于检查过的人, 务必不要再去检查, 否则可能导致无限循环。 (查看原文)
    2018-04-17 18:02:05
    —— 引自章节:6.6
  • NP完全问题的简单定义是, 以难解著称的问题, 如旅行商问题和集合覆盖问题。 很多非常聪明的人都认为, 根本不可能编写出可快速解决这些问题的算法但如果要找出经由指定几个点的的最短路径, 就是旅行商问题——NP完全问题。 简言之, 没办法判断问题是不是NP完全问题, 但还是有一些蛛丝马迹可循的。元素较少时算法的运行速度非常快, 但随着元素数量的增加, 速度会变得非常慢。涉及“所有组合”的问题通常是NP完全问题。不能将问题分成小问题, 必须考虑各种可能的情况。 这可能是NP完全问题。如果问题涉及序列( 如旅行商问题中的城市序列) 且难以解决, 它可能就是NP完全问题。如果问题涉及集合( 如广播台集合) 且难以解决, 它可能就是NP完全问题。如果问题可转换为集合覆盖问题或旅行商问题, 那它肯定是NP完全问题。贪婪算法寻找局部最优解, 企图以这种方式获得全局最优解。对于NP完全问题, 还没有找到快速解决方案。面临NP完全问题时, 最佳的做法是使用近似算法。贪婪算法易于实现、 运行速度快, 是不错的近似算法。 (查看原文)
    2018-04-18 00:07:17
    —— 引自章节:第8章 贪婪算法
  • // the graphconst graph = {}graph["start"] = {}graph["start"]["a"] = 6 graph["start"]["b"] = 2graph["a"] = {}graph["a"]["fin"] = 1graph["b"] = {}graph["b"]["a"] = 3 graph["b"]["fin"] = 5graph["fin"] = {}// The costs tableconst costs = {};costs['a'] = 6 costs['b'] = 2;costs['fin'] = Infinity;// the parents tableconst parents = {};parents['a'] = 'start';parents['b'] = 'start';parents['fin'] = null;let processed = [];function find_lowest_cost_node(costs) { let lowest_cost = Infinity; let lowest_cost_node = null; // Go through each node for (let node in costs) { let cost = costs[node]; // If it's the lowest cost so far and hasn't been processed yet... if (cost < lowest_cost && (processed.indexOf(node) === -1)) { // ... set ... (查看原文)
    2018-04-18 01:28:27
    —— 引自章节:第7章 狄克斯特拉算法 code js
  • Facebook实际使用的是什么呢?很可能是十多个数据库,它们基于众多不同的数据结构:散列表、B树等。数组和链表是这些更复杂的数据结构的基石。 (查看原文)
    丽拉先生2019-04-19 09:55:28
    —— 引自第182页

>我来写笔记

>算法图解

算法图解
作者: [美] Aditya Bhargava
原作名: Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People
isbn: 7115447632
书名: 算法图解
页数: 196
出品方: 图灵教育
译者:袁国忠
定价: 49.00元
出版社: 人民邮电出版社
出版年: 2017-3
装帧: 平装
© 2005-2025 douban.com, all rights reserved 北京豆网科技有限公司关于豆瓣 ·在豆瓣工作 ·联系我们 ·法律声明 ·帮助中心 ·图书馆合作 ·移动应用

[8]ページ先頭

©2009-2025 Movatter.jp