当前位置:首页 > 电子书 > 电子书下载 > 程序设计 >
算法图解 算法图解
2680594

2680594 提供上传

资源
34
粉丝
14
喜欢
140
评论
19

    算法图解 PDF 高清版

    算法电子书
    • 发布时间:2020-01-09 21:27:25

    给大家带来的一篇关于算法相关的电子书资源,介绍了关于算法、图解、图灵、程序设计方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小11 MB,巴尔加瓦,袁国忠编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.4。

  • 算法图解 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1ovsCcGnFKEWGjnFyfJ0cs
  • 提取码:cfv4
  • 像小说集一样趣味的算法新手入门书。
    算法是解决困难的一步步步骤,都是电子信息科学行业的关键主题。现如今程序员*常见的算法早已历经了古人的探索、检测及证实。假如你要搞明白这种算法,又不愿困在在繁杂的证实中,这书更是你的不二选择。这部图例丰富多彩、扣人心弦的好用手册将给你轻轻松松懂得怎样在自身的程序流程中高效率应用关键的算法。
    这书范例丰富多彩,图片配文字,以令人非常容易了解的方法诠释了算法,致力于协助程序员在平时新项目中充分发挥算法的动能。书中的前三章将协助你奠定基础,陪你学习培训二分查找、大O表示法、二种基础的数据结构及其递归等。剩下的篇数将关键详细介绍运用普遍的算法,主要内容包含:应对实际难题时的处理方法,例如,什么时候选用贪欲算法或动态规划;散列表的运用;图算法;Kzui近邻算法。

    目录

    • 前言
    • 致谢
    • 关于本书
    • 第1 章 算法简介 1
    • 1.1 引言 1
    • 1.1.1 性能方面 1
    • 1.1.2 问题解决技巧 2
    • 1.2 二分查找 2
    • 1.2.1 更佳的查找方式 4
    • 1.2.2 运行时间 8
    • 1.3 大O 表示法 8
    • 1.3.1 算法的运行时间以不同的速度增加 9
    • 1.3.2 理解不同的大O运行时间 10
    • 1.3.3 大O 表示法指出了最糟情况下的运行时间 12
    • 1.3.4 一些常见的大O运行时间 12
    • 1.3.5 旅行商 13
    • 1.4 小结 15
    • 第2 章 选择排序 16
    • 2.1 内存的工作原理 16
    • 2.2 数组和链表 18
    • 2.2.1 链表 19
    • 2.2.2 数组 20
    • 2.2.3 术语 21
    • 2.2.4 在中间插入 22
    • 2.2.5 删除 23
    • 2.3 选择排序 25
    • 2.4 小结 28
    • 第3 章 递归 29
    • 3.1 递归 29
    • 3.2 基线条件和递归条件 32
    • 3.3 栈 33
    • 3.3.1 调用栈 34
    • 3.3.2 递归调用栈 36
    • 3.4 小结 40
    • 第4 章 快速排序 41
    • 4.1 分而治之 41
    • 4.2 快速排序 47
    • 4.3 再谈大O表示法 52
    • 4.3.1 比较合并排序和快速排序 53
    • 4.3.2 平均情况和最糟情况 54
    • 4.4 小结 57
    • 第5 章 散列表 58
    • 5.1 散列函数 60
    • 5.2 应用案例 63
    • 5.2.1 将散列表用于查找 63
    • 5.2.2 防止重复 64
    • 5.2.3 将散列表用作缓存 66
    • 5.2.4 小结 68
    • 5.3 冲突 69
    • 5.4 性能 71
    • 5.4.1 填装因子 72
    • 5.4.2 良好的散列函数 74
    • 5.5 小结 75
    • 第6 章 广度优先搜索 76
    • 6.1 图简介 77
    • 6.2 图是什么 79
    • 6.3 广度优先搜索 79
    • 6.3.1 查找最短路径 82
    • 6.3.2 队列 83
    • 6.4 实现图 84
    • 6.5 实现算法 86
    • 6.6 小结 93
    • 第7 章 狄克斯特拉算法 94
    • 7.1 使用狄克斯特拉算法 95
    • 7.2 术语 98
    • 7.3 换钢琴 100
    • 7.4 负权边 105
    • 7.5 实现 108
    • 7.6 小结 116
    • 第8 章 贪婪算法 117
    • 8.1 教室调度问题 117
    • 8.2 背包问题 119
    • 8.3 集合覆盖问题 121
    • 8.4 NP 完全问题 127
    • 8.4.1 旅行商问题详解 127
    • 8.4.2 如何识别NP 完全问题 131
    • 8.5 小结 133
    • 第9 章 动态规划 134
    • 9.1 背包问题 134
    • 9.1.1 简单算法 135
    • 9.1.2 动态规划 136
    • 9.2 背包问题FAQ 143
    • 9.2.1 再增加一件商品将如何呢 143
    • 9.2.2 行的排列顺序发生变化时结果将如何 145
    • 9.2.3 可以逐列而不是逐行填充网格吗 146
    • 9.2.4 增加一件更小的商品将如何呢 146
    • 9.2.5 可以偷商品的一部分吗 146
    • 9.2.6 旅游行程最优化 147
    • 9.2.7 处理相互依赖的情况 148
    • 9.2.8 计算最终的解时会涉及两个以上的子背包吗 148
    • 9.2.9 最优解可能导致背包没装满吗 149
    • 9.3 最长公共子串 149
    • 9.3.1 绘制网格 150
    • 9.3.2 填充网格 151
    • 9.3.3 揭晓答案 152
    • 9.3.4 最长公共子序列 153
    • 9.3.5 最长公共子序列之解决方案 154
    • 9.4 小结 155
    • 第10 章 K 最近邻算法 156
    • 10.1 橙子还是柚子 156
    • 10.2 创建推荐系统 158
    • 10.2.1 特征抽取 159
    • 10.2.2 回归 162
    • 10.2.3 挑选合适的特征 164
    • 10.3 机器学习简介 165
    • 10.3.1 OCR 165
    • 10.3.2 创建垃圾邮件过滤器 166
    • 10.3.3 预测股票市场 167
    • 10.4 小结 167
    • 第11 章 接下来如何做 168
    • 11.1 树 168
    • 11.2 反向索引 171
    • 11.3 傅里叶变换 171
    • 11.4 并行算法 172
    • 11.5 MapReduce 173
    • 11.5.1 分布式算法为何很有用 173
    • 11.5.2 映射函数 173
    • 11.5.3 归并函数 174
    • 11.6 布隆过滤器和HyperLogLog 174
    • 11.6.1 布隆过滤器 175
    • 11.6.2 HyperLogLog 176
    • 11.7 SHA 算法 176
    • 11.7.1 比较文件 177
    • 11.7.2 检查密码 178
    • 11.8 局部敏感的散列算法 178
    • 11.9 Diffie-Hellman 密钥交换 179
    • 11.10 线性规划 180
    • 11.11 结语 180
    • 练习答案 181

    读书笔记

    原生JS实现移动端web轮播图详解(结合Tween算法造轮子)

    前言

    相信大家应该都知道,移动端的轮播图是我们比较常见的需求, 我们最快的实现方式往往是 使用第三方的代码, 例如 swiper , 但当遇到一些比较复杂的轮播图需求时, 往往是束手无策,不知道怎么改.      

    所以我们要尝试去自己造一些轮子, 以适应各种复杂多变的需求;  另外一点, 自己写的代码如果有bug是很容易修复的, 对自身的提高也很大.

    在没有阅读swiper源码的过程下,我尝试自己实现一个简易而不失实用的移动端轮播图, 经过几个小时的思考和实践终于还是实现了(如图):

    原生JS实现移动端web轮播图详解(结合Tween算法造轮子)

    实现移动端的轮播图要比pc复杂一些,主要表现在以下几个方面:

         1.轮播图要适应不同宽度/dpr的屏幕 

         2.需要使用 touch相关的事件 

         3.不同机型对 touch事件支持的不太一样,可能会有一些兼容性问题 

         4.手指移动图片一部分距离,剩下的距离需要自动完成 

         5.自动完成距离需要有 ease 时间曲线 

    但编程解决问题的思路都是差不多的,

    我们在使用轮播图的时候可以仔细观察,通过现象看到本质:

    • 我们在使用轮播图的时候可以仔细观察,通过现象看到本质: 
    • 手指放在图片上, 手指向左或者向右移动, 图片也随之移动; 
    • 手指移动的距离少时,图片自动复原位置;手指移动的距离多时,自动切换到下一张; 
    • 手指向左或者向右移动的快时,会切换到下一张; 
    • 图片轮播是无限循环的, 我们需要采用  3 1 2 3 1的方式来实现, 即 N+2张图来实现N张图的无限循环轮播 

    我们通过分析现象,可以提出一个基本实现方案:

         1. 手指触摸事件可以通过 touchstart touchmove touchend 3个事件来实现 

         2.在手指 touchstart的时候我们需要记录 手指的x坐标,  可以使用 touch的pageX属性; 还有 这个时间点, 

         3.手指touchmove的时候我们也需要记录pageX,并且记录累计移动的距离 moveX 

         4.手指离开的时候,记录时间点, 根据前两步计算的 x方向移动的距离,时间点之差 

         5.通过比较x方向移动距离来判断移动方向, 以及是否应该切换到下一张图; 根据时间判断用户是否进行了左右扫动的操作 

         6.移动图片可以使用 translate3d来实现,开启硬件加速 

         7.移动一段距离需要 easeOut效果,我们可以使用 Tween算法中的easeOut来实现我们每次移动的距离; 当然也可以使用 js设置 transition动画 

    实现源码(仅供参考):

    head头部样式

    <head> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width,initial-scale=.5,maximum-scale=.5"> 
     <title>移动端轮播图</title> 
     <style> 
     * { 
     box-sizing: border-box; 
     margin: 0; 
     padding: 0 
     } 
     .banner { 
     overflow: hidden; 
     width: 100%; 
     height: 300px 
     } 
     .banner .img-wrap { 
     position: relative; 
     height: 100% 
     } 
     .banner img { 
     display: block; 
     position: absolute; 
     top: 0; 
     width: 100%; 
     height: 100% 
     } 
     </style> 
    </head> 

    HTML结构

    <div class="banner"> 
     <div class="img-wrap" id="imgWrap"> 
     <img src="images/banner_3.jpg" data-index="-1"> 
     <img src="images/banner_1.jpg" data-index="0"> 
     <img src="images/banner_2.jpg" data-index="1"> 
     <img src="images/banner_3.jpg" data-index="2"> 
     <img src="images/banner_1.jpg" data-index="3"> 
     </div> 
    </div> 

    JS代码1, easeOut动画式移动,

    这里的   HTMLElement.prototype.tweenTranslateXAnimate ,是给所有的HTML元素类扩展的tweenTranslateXAnimate方法

    移动一段距离我们需要使用定时器来帮助我们完成,这个重复的操作

    <script> 
     HTMLElement.prototype.tweenTranslateXAnimate = function (start, end, callback) { 
     var duration = 50; 
     var t = 0; 
     var vv = end - start; 
     var Tween = { 
     Quad: { 
     easeOut: function (t, b, c, d) { 
      return -c * (t /= d) * (t - 2) + b; 
     } 
     } 
     }; 
     
     this.timer = setInterval(function () { 
     var dis = start + Tween.Quad.easeOut(++t, 0, vv, duration); 
     this.style.transform = 'translate3d(' + dis + 'px, 0, 0)'; 
     if (vv > 0 && parseInt(this.style.transform.slice(12)) >= end) { 
     this.style.transform = 'translate3d(' + parseInt(dis) + 'px, 0, 0)'; 
     clearInterval(this.timer); 
     callback && callback(); 
     } 
     if (vv < 0 && parseInt(this.style.transform.slice(12)) <= end) { 
     this.style.transform = 'translate3d(' + parseInt(dis) + 'px, 0, 0)'; 
     clearInterval(this.timer); 
     callback && callback(); 
     } 
     }.bind(this), 4); 
     } 
    </script> 

    touch事件部分

    <script> 
     ~function () { 
     var lastPX = 0; // 上一次触摸的位置x坐标, 需要计算出手指每次移动的一点点距离 
     var movex = 0; // 记录手指move的x方向值 
     var imgWrap = document.getElementById('imgWrap'); 
     var startX = 0; // 开始触摸时手指所在x坐标 
     var endX = 0; // 触摸结束时手指所在的x坐标位置 
     var imgSize = imgWrap.children.length - 2; // 图片个数 
     var t1 = 0; // 记录开始触摸的时刻 
     var t2 = 0; // 记录结束触摸的时刻 
     var width = window.innerWidth; // 当前窗口宽度 
     var nodeList = document.querySelectorAll('#imgWrap img'); // 所有轮播图节点数组 NodeList 
     
     // 给图片设置合适的left值, 注意 querySelectorAll返回 NodeList, 具有 forEach方法 
     nodeList.forEach(function (node, index) { 
     node.style.left = (index - 1) * width + 'px'; 
     }); 
     
     /** 
     * 移动图片到当前的 tIndex索引所在位置 
     * @param {number} tIndex 要显示的图片的索引 
     * */ 
     function toIndex(tIndex) { 
     var dis = -(tIndex * width); 
     var start = parseInt(imgWrap.style.transform.slice(12)); 
     // 动画移动 
     imgWrap.tweenTranslateXAnimate(start, dis, function () { 
     setTimeout(function () { 
      movex = dis; 
      if (tIndex === imgSize) { 
      imgWrap.style.transform = 'translate3d(0, 0, 0)'; 
      movex = 0; 
      } 
      if (tIndex === -1) { 
      imgWrap.style.transform = 'translate3d(' + width * (1 - imgSize) + 'px, 0, 0)'; 
      movex = -width * (imgSize - 1); 
      } 
     }, 0); 
     }); 
     } 
     
     /** 
     * 处理各种触摸事件 ,包括 touchstart, touchend, touchmove, touchcancel 
     * @param {Event} evt 回调函数中系统传回的 js 事件对象 
     * */ 
     function touch(evt) { 
     var touch = evt.targetTouches[0]; 
     var tar = evt.target; 
     var index = parseInt(tar.getAttribute('data-index')); 
     if (evt.type === 'touchmove') { 
     var di = parseInt(touch.pageX - lastPX); 
     endX = touch.pageX; 
     movex += di; 
     imgWrap.style.webkitTransform = 'translate3d(' + movex + 'px, 0, 0)'; 
     lastPX = touch.pageX; 
     } 
     if (evt.type === 'touchend') { 
     var minus = endX - startX; 
     t2 = new Date().getTime() - t1; 
     if (Math.abs(minus) > 0) { // 有拖动操作 
      if (Math.abs(minus) < width * 0.4 && t2 > 500) { // 拖动距离不够,返回! 
      toIndex(index); 
      } else { // 超过一半,看方向 
      console.log(minus); 
      if (Math.abs(minus) < 20) { 
      console.log('距离很短' + minus); 
      toIndex(index); 
      return; 
      } 
      if (minus < 0) { // endX < startX,向左滑动,是下一张 
      toIndex(index + 1) 
      } else { // endX > startX ,向右滑动, 是上一张 
      toIndex(index - 1) 
      } 
      } 
     } else { //没有拖动操作 
     
     } 
     } 
     if (evt.type === 'touchstart') { 
     lastPX = touch.pageX; 
     startX = lastPX; 
     endX = startX; 
     t1 = new Date().getTime(); 
     } 
     return false; 
     } 
     
     imgWrap.addEventListener('touchstart', touch, false); 
     imgWrap.addEventListener('touchmove', touch, false); 
     imgWrap.addEventListener('touchend', touch, false); 
     imgWrap.addEventListener('touchcancel', touch, false); 
     
     }(); 
     
    </script> 

    在触摸事件中最关键的参数是  pageX参数, 记录x的位置.

    当然这只是一个demo,还需要进一步的优化和封装, 以便于我们用在真实的项目.

    本demo仅仅是提供了一个解决问题的思路, 有了这个思路,相信各种复杂的需求也得以解决...

    本文中使用的 tween算法来实现 ease-out效果 ,也可以使用 transtion动画实现, 代码更加简洁,参见轮播图优化篇: //www.jb51.net/article/123304.htm

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

    上一篇:Linux/UNIX系统编程手册(上、下册)

    下一篇:未来简史

    展开 +

    收起 -

     
    算法 相关内容
    百面机器学习:算法工程师带你去面试
    百面机器学习:算法工程师带你去面试 影印版

    人工智能领域正在以超乎人们想象的速度发展,本书赶在人工智能彻底占领世界之前完成编写,实属万幸。 书中收录了超过100道机器学习算法工程师的面试题目和解答,其中大部分源于Hulu算法

    立即下载
    数据算法:Hadoop/Spark大数据处理技巧
    数据算法:Hadoop/Spark大数据处理技巧 高清版

    数据算法:Hadoop/Spark大数据处理技巧 介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这本书还概

    立即下载
    Kotlin程序员面试算法宝典
    Kotlin程序员面试算法宝典 影印完整版

    《Kotlin程序员面试算法宝典》是一本讲解程序员面试笔试算法的书籍。在写法上,除了讲解如何解答算法问题以外,还引入了例子辅以说明,以便读者能够更加容易地理解。

    立即下载
    深度学习:人工智能算法(Deep Learning)
    深度学习:人工智能算法(Deep Learning) 高清版

    本书包括3 个部分:第1 部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识;第2 部分系统深入地讲解现今已成熟的深度学习方法和技术;第3 部分讨论某些具有前瞻性的方

    立即下载
    C/C++常用算法手册
    C/C++常用算法手册 高清版

    《C/C++常用算法手册》 分3篇,共13章,第1篇算法基础篇介绍了算法概述,重点分析了数据结构和基本算法思想;第2篇算法基本应用篇详细讲解了算法在排序、查找、数值计算、数论、经典趣题

    立即下载
    分布式机器学习:算法、理论与实践
    分布式机器学习:算法、理论与实践 完整版

    《分布式机器学习:算法、理论与实践》 旨在全面介绍分布式机器学习的现状,深入分析其中的核心技术问题,并且讨论该领域未来的发展方向。 全书共12章。第1章是绪论,向大家展示分布式

    立即下载
    极简算法史:从数学到机器的故事
    极简算法史:从数学到机器的故事 带目录原版

    简易易读、精妙灵巧的人们数学课与社会学逻辑思维史讨论有趣的数学难题和思维逻辑迷题再现思想家、物理学家与逻辑学家与众不同的思维模式数学课、逻辑学与电子信息科学相互迈向人工

    立即下载
    趣题学算法(C++)
    趣题学算法(C++) 原版完整版 立即下载
    学习笔记
    网友NO.968910

    round robin权重轮循算法php实现代码

    先上代码,采用php脚本语言 ?php/* * Copyright (C) FatHong *//* 数据初始化,weight: 权重 */$hosts['a'] = array('weight' = 5, 'current_weight' = 0, 'count' = 0);$hosts['b'] = array('weight' = 3, 'current_weight' = 0, 'count' = 0);$hosts['c'] = array('weight' = 2, 'current_weight' = 0, 'count' = 0);$result = array();/* 模拟10次 */for ($i = 0; $i 10; $i++) { round_robin($hosts, $result);}/* 输出结果 */print_r($result);/* round robin 轮循 */function round_robin($result){ $total = 0; $best = null; foreach ($hosts as $key = $item) { $current = $weight = $current['weight']; $current['current_weight'] += $weight; $total += $weight; if ( ($best == null) || ($hosts[$best]['current_weight'] $current['current_weight']) ) { $best = $key; } } $hosts[$best]['current_weight'] -= $total; $hosts[$best]['count']++; $result[] = $best;} 输出结果: Array ( [0] = a [1] = b [2] = c [3] = a [4] = a [5] = b [6] = a [7] = c [8] = b [9] = a ) 负载均衡的服务器中,其实现算法有种是round-robin权重轮循,就是后端的服务器列表中,给每个服务器标上权重,代表它被采用的机率。 这段代码把最简洁的流程剥离出来,没考虑后端挂起等情况,可以知道它是怎么实现的,仅供参考. ……

    网友NO.314522

    java排序算法之_选择排序(实例讲解)

    选择排序是一种非常简单的排序算法,从字面意思我们就可以知道,选择就是从未排序好的序列中选择出最小(最大)的元素,然后与第 i 趟排序的第 i-1(数组中下标从 0 开始) 个位置的元素进行交换,第 i 个元素之前的序列就是已经排序好的序列。整个排序过程只需要遍历 n-1 趟便可排好,最后一个元素自动为最大(最小)值。 举个小例子: arr[] = {3,1,2,6,5,4} 第 1 趟排序: index = 0, min = 1, 交换后 -- 1,3,2,6,5,4 第 2 趟排序: index = 1, min = 2, 交换后 -- 1,2,3,6,5,4 第 3 趟排序: index = 2, min = 2, 交换后 -- 1,2,3,6,5,4 第 4 趟排序: index = 3, min = 5, 交换后 -- 1,2,3,4,5,6 第 5 趟排序: index = 4, min = 4, 交换后 -- 1,2,3,4,5,6 核心代码如下: /** * 选择排序,从小到大排序 */ public static void selectsort(int[] arr) { int min = 0; //记录最小值的索引 //遍历 n-1 轮,最后一个数不用遍历比较 for(int i = 0; i arr.length - 1; i++) { min = i; //初始最小值为每轮循环的第一个数 //遍历初始最小值后的所有数 for(int j = i + 1; j arr.length; j++) { if(arr[min] arr[j]) { //判断是否存在比最小值小的数 min = j; //记录下标 } } if(min != i) { //判断最小值的索引是否等于初始最小值的索引 int temp = arr[min]; //不是则进行最小值交换 arr[min] = arr[i]; arr[i] = temp; } } } 选择排序算法是一种不稳定的算法,它的时间……

    网友NO.571904

    70行Java代码实现深度神经网络算法分享

    对于现在流行的深度学习,保持学习精神是必要的——程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到——用不用是政治问题,会不会写是技术问题,就像军人不关心打不打的问题,而要关心如何打赢的问题。 程序员如何学习机器学习 对程序员来说,机器学习是有一定门槛的(这个门槛也是其核心竞争力),相信很多人在学习机器学习时都会为满是数学公式的英文论文而头疼,甚至可能知难而退。但实际上机器学习算法落地程序并不难写,下面是70行代码实现的反向多层(BP)神经网络算法,也就是深度学习。其实不光是神经网络,逻辑回归、决策树C45/ID3、随机森林、贝叶斯、协同过滤、图计算、Kmeans、PageRank等大部分机器学习算法都能在100行单机程序内实现(以后考虑分享出来)。 机器学习的真正难度在于它为什么要这么计算,它背后的数学原理是什么,怎么推导得来的公式,网上大部分的资料都在介绍这部分理论知识,却很少告诉你该算法的计算过程和程序落地是怎么样的,对于程序员来说,你需要做的仅是工程化应用,而不需要证明出一项新的数学计算方法。实际大部分机器学习工程师都是利用别人写好的开源包或者工具软件,输入数……

    电子书 编程教程 文档 软件 源码 视频

    Copyright 2018-2020 xz577.com 码农之家

    本站所有电子书资源不再提供下载地址,只分享来路

    免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

    版权投诉 / 书籍推广 / 赞助:QQ:520161757