算法

《算法》笔记 15

拜拜、爱过 提交于 2020-02-27 08:10:22
暴力子字符串查找算法 隐式回退 性能 显式回退 Knuth-Morris-Pratt算法 确定有限状态自动机 DFA的构造 性能 Boyer-Moore算法 跳跃表的构建 性能 Rabin-Karp指纹字符串算法 关键思想 Horner方法 性能 字符串的一种基本操作就是子字符串查找。比如在文本编辑器或是浏览器中查找某个单词时,就是在查找子字符串。子字符串的长度(可能为100或1000)相对于整个文本的长度(可能为100万甚至是10亿)来说一般是很短的,在如此多的字符中找到匹配的模式是一个很大的挑战,为此计算机科学家们发明了多种有趣、经典且高效的算法。 ### 暴力子字符串查找算法 要解决这个问题,首先想到的是暴力查找的方法,在文本中模式可能出现匹配的任何地方检查是否匹配。 #### 隐式回退 首先是隐式回退的实现方式,之所以叫隐式回退,在与显式回退的实现对比后就明白原因了。 public static int search(String pat, String txt) { int patL = pat.length(); int txtL = txt.length(); for (int i = 0; i <= txtL - patL; i++) { int j; for (j = 0; j < patL; j++) if (txt.charAt(i + j) != pat

算法之排序(上)

守給你的承諾、 提交于 2020-02-27 08:02:47
文章来源: http://blog.seclibs.com/算法之排序(上)/ 排序算法有很多种,甚至有很多都完全没有听过,我们最常见,也最经典的就是:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。 按照时间复杂度来进行划分可以将其划分为三类 O(n2) :冒泡、插入、选择;基于比较 O(nlogn):快排、归并;基于比较 O(n):桶、计数、基数;不基于比较 这次我们来说时间复杂度为O(n2)的 在说具体的排序方法之前,先明确排序算法的评价标准 首先是排序算法的执行效率,执行效率一般从最好、最坏、平均时间复杂度上分析,其分析时间复杂度时需要考虑系数、常数和低阶,因为时间复杂度是在数据规模特别大的时候的增长趋势,在平时的代码中,数量级都是比较小的,所以还需要考虑这些问题。在基于比较的排序算法中,数值比较的次数和数据的移动次数也都是需要考虑进去的。 其次是内存的消耗,算法的内存消耗可以用空间复杂度来表示,当空间复杂度为O(1)的算法也可以称之为原地排序算法。 最后是算法的稳定性,当一组数据中有两个相同的值时,排序之后两个值的顺序是如果没有交换那它就是具有稳定性的算法。 然后我们再引入两个概念, 有序度 和 逆序度 有序度 是数组中具有有序关系的元素对的个数。 比如说2、4、3、1、5、6这组数组的有序度是11,因为它有11个有序元素对,分别是(2,4)

亚像素Sub Pixel

孤者浪人 提交于 2020-02-27 05:04:36
亚像素Sub Pixel 评估图像处理算法时,通常会考虑是否具有亚像素精度。 亚像素概念的引出: 图像处理过程中,提高检测方法的精度一般有两种方式:一种是提高图像系统的光学放大倍数和CCD相机的分辨率能力;另一种是引入亚像素细分技术来弥补硬件的不足以提高图像系统的分辨率。 如使用亚像素细分技术将精度提到到0.01像素,就相当于提高了100倍的图像系统分辨率。 [分辨率可以从显示分辨率与图像分辨率两个方向来分类。 显示分辨率 (屏幕分辨率)是屏幕 图像 的精密度,是指 显示器 所能显示的 像素 有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越 精细 ,同样的屏幕区域内能显示的信息也越多。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。 图像分辨率 则是单位英寸(PPI,pixel per inch)中所包含的像素点数,其定义更趋近于分辨率本身的定义。] 优点: 大大节省系统的硬件投入成本,降低技术应用的难度,扩大其应用范围。 亚像素细分技术最早是由Hueckel M F在a local visual operator which recognizes edges and lines中提出。目前此技术已取得了很好的成果。 亚像素定义: 像素是成像面的基本单位也是最小单位,通常被称为图像的物理分辨率。

做了几年程序员,某天居然发现自己没学过数据结构。。。

左心房为你撑大大i 提交于 2020-02-27 03:06:10
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

数据结构与算法学习第一天

浪尽此生 提交于 2020-02-27 02:55:17
算法的概念 : 算法是计算机处理信息的本质。当算法处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址以供以后调用。 算法是独立存在的一种解决问题的方法和思路,语言并不重要,重要的是思想。 算法的特征 : 1.输入:算法具有0个或多个输入 2.输出:算法至少有一个或多个输出 3.有穷性:散发在有限的步骤之后会自动结束而不会无限 循环,并且每一步骤可以在可接受的时间内完成。 4.确定性:算法中的每一步都有确定的含义,不会出现二义性。 5.可行性:算法的每一步都是可行的,也就是说每一步都能够在执行有限的次数内完成。 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。同一个问题会有多种算法,算法之间的效率是有差别的。计算机执行环境不同,因此单纯依靠运行时间来比较算法的优劣并不一定是客观准确的。 时间复杂度与“大O记法” : “大O记法”:对于函数f,总有f(n)≤c*g(n),忽略常数c的情况下,函数g是f的一个渐进函数,记为f(n)=O(g(n))。也就是说,在去向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。 时间复杂度:假设存在函数g,使得算法A处理规模为n的问题实例所用时间为T(n)=O(g(n)),则称T(n)=O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,记为T(n)。例如

大规模单位实时游戏寻路的构建

China☆狼群 提交于 2020-02-27 02:28:24
本文发布于游戏程序员刘宇的个人博客,欢迎转载,请注明来源https://www.cnblogs.com/xiaohutu/p/10504586.html 某个神秘的时间,我接到了一项神秘的任务,最核心的难度是要求实现:引擎是Unity3D,在手机端可以流畅运行为前提,在一个实时战斗的过程里,地图有地形(而且是会被动态改变的地形),数百个单位独立AI寻路、要实现忽略掉部分单位的筛选寻路、动态避障、满足帧同步需求并可以被服务器验证。可以说这个需求是集合了各种难点于一身。在这个任务的过程里,发现网上这样的文章比较少,所以想总结分享一下。着重于算法和思路这一块,不涉及图形上的问题。 一. 通常怎么做 需要寻路,又需要避障,先说一些常规的解决思路: 1.1 寻路 寻路就是基于既有的数据寻找到符合条件的一条路线: 1. 拿来主义类:用unity3d自己的NavMesh、自己的A* project,包含了寻路数据的生成和计算。 2. 进阶类:格子寻路可以用:   自己写A* 算法,进行常见的优化(二叉堆优化、HOT优化等等等等), 分层A*   JPS以及各种优化(位运算,剪枝,预处理等)   Dijkstra(扩展Dynamic A*)   DFS, BFS   。。。   (后续开文详解) 1.2 避障部分 合理的通过改变自己的行为(速度,方向)来避免穿插: 0. 真实物理 1.

[Reading] Asking while Reading

偶尔善良 提交于 2020-02-27 02:16:20
           Asking while Reading           ——读Java垃圾收集器与内存分配策略 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 为什么要了解垃圾回收?   当需要排查各种内存溢出、内存泄漏问题的时候,当垃圾回收成为了系统达到更高并行量的瓶颈的时候,我们就需要根据情况(往往是根据硬件和程序 以及它们在各种垃圾回收算法下运行的情况)选择恰当的垃圾回收方式,作出必要的监控和调节。 哪些内存需要回收? 换一句话来说:哪些内存可以回收,哪些内存又值得回收;可以回收明确我们的执行范围,而回收价值明确我们的主要目标,当然这不是一定的, 对每个项目都可能有不同的着眼点,这也是我们要理解垃圾回收方法与过程的原因。 Java堆和方法区与栈不同,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运 行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾回收器关注的是这部分内存。    方法区也需要回收吗? 方法区可以不回收,因为Java虚拟机规范中说过不要求虚拟机在方法区中实现垃圾收集,更重要的原因是其性价比一般较低,原因如下: 我们知道对方法区的收集集中在对常量、无用的类的收集。   1) 效率:常规一次垃圾收集可以回收70

数据结构与算法系列二(复杂度分析)

末鹿安然 提交于 2020-02-26 23:33:23
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在开篇中提到了复杂度分析,与大O表示法的概念。具体要如何进行复杂度分析