算法
我就算饿死也不做程序员
欢迎关注同名公众号:"我就算饿死也不做程序员"。
交个朋友,一起交流,一起学习,一起进步。
展开
-
局部敏感哈希(LSH):高维数据下的最近邻查找
哈希算法首先,将局部敏感哈希之前,我们先说下普通的哈希算法,把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。最理想的是所有不同的输入都可以映射到散列值,但是存在这种可能性的。当不同的输入映射到相同的散列值时,就称为碰撞冲突。哈希算法是要避免碰撞冲突,而局部敏感哈希(Locality-Sensitive Hashing, 下面我们简称LSH)则相反,是要创造更多的碰撞冲突。局部敏感哈希应用首先,我们讲一下LSH的应用,方便理解LSH是做什么的。在很多领域中,经常会使用最近邻查原创 2020-08-20 20:23:58 · 4122 阅读 · 9 评论 -
布隆过滤器 (Bloom Filter):用于超大数据量时检索一个元素是否存在
相信大家在开发过程中,经常会遇到判断一个字符串(或其他类型的变量值)是否已经出现过的需求,这个时候一般使用HashMap可以解决,先将出现过的字符串存于HashMap对象的keySet中,下次只要判断HashMap对象的keySet是否含有该字符串,就能知道是否其已经出现过。但是,当我们HashMap存放的数据越多,查询速度就会越慢,而且占用内存也会越大。为什么查询速度会变慢呢?知道HashMap底层原理的就不难想到,key的hashcode分布不均匀,可能很多key的hashcode被分配到同一个位原创 2020-08-12 21:07:44 · 760 阅读 · 0 评论 -
回溯算法之马踏棋盘(骑士周游)
马踏棋盘马踏棋盘(骑士周游)是4399的一个小游戏,游戏规则很简单:玩过象棋吗?这款和国内外的象棋都不一样,里面只有一只马在跳,但是跳过的格子都会出现数字来围困你,所以记得不要被这些数字围住,否则游戏就结束了。来挑战一下新玩法吧。虽然游戏规则很简单,但是如果想要通关的话,却是很有难度的,下面我们通过算法来寻找通关方法。回溯算法回溯算法的思想其实很简单:我们在寻找解决方案,当遇到有多种选...原创 2020-01-10 07:09:46 · 985 阅读 · 0 评论 -
最短路径算法之弗洛伊德算法(Floyd)
这篇博客的主题的最短路径算法的另一种算法:弗洛伊德算法(Floyd),之前的博客已经讲解过最短路径算法之Dijkstra(迪杰斯特拉)Floyd与Dijkstra的区别Floyd算法是算出各个顶点之间的最短路径;Dijkstra算法是选择一个顶点,算出其到达其他顶点的最短路径Floyd算法原理设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点v...原创 2019-12-28 10:45:10 · 645 阅读 · 0 评论 -
最短路径算法之Dijkstra(迪杰斯特拉)
Dijkstra算法迪杰斯特拉(Dijkstra)是典型的最短路径算法,顾名思义就是从一个点出发,到达另一个点的最短路径。算法原理例如,我们以一个案例来讲解他的算法原理。大体的思想是:每次选择一个未被访问过、并且最短距离最短的点作为访问顶点,然后访问各个顶点,让访问顶点作为新的路径,到各个顶点之间的最短距离与各个顶点原本的最短距离进行比较,发现距离更短则然后进行路径更新。一、 首先,我...原创 2019-12-26 07:48:45 · 1223 阅读 · 0 评论 -
最小生成树-普利姆和克鲁斯卡尔算法
最小生成树主要是用于解决修路问题等类似问题,要将所有顶点连通,并且权值之和最小。最小生成树给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树N个顶点,一定有N-1条边包含全部顶点N-1条边都在图中求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法普利姆算法算法介绍普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找...原创 2019-12-05 07:53:49 · 1940 阅读 · 0 评论 -
贪心算法之集合覆盖问题
贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果集合覆盖问题假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号?广播...原创 2019-11-27 07:43:27 · 2446 阅读 · 0 评论 -
如何实现高效地字符串匹配:KMP算法
KMP算法是一种判断字符串中是否含有特定子串的优化算法,效率比暴力搜索高出许多,是一个值得学习的算法。其中,最关键的一步就是根据子串部分匹配表来加快搜索速度。KMP算法步骤举例来说,有一个字符串 Str1 = “BBC ABCDAB ABCDABCDABDE”,判断,里面是否包含另一个字符串 Str2 = “ABCDABD”?1.首先,用Str1的第一个字符和Str2的第一个字符去比较,不...原创 2019-11-26 07:25:57 · 724 阅读 · 0 评论 -
通过背包问题来学习动态规划的思想
目录动态规划介绍背包问题解决思路总结规律代码实现动态规划介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立...原创 2019-11-21 07:14:03 · 175 阅读 · 0 评论 -
使用递归实现汉诺塔来理解分治算法
分治算法分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治算法一般分为三个步骤:分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题合并:将各个子...原创 2019-11-19 08:00:59 · 294 阅读 · 0 评论 -
二分查找算法原理和实现
二分查找是一种比较高效的搜索算法,是一种可以在有序数组中搜索到特定元素的算法。例如,我们要在数组{1,4,6,10,20}中搜索4首先与数组的中间位置的数值即6进行比较,4比6小,所以,要往左边继续搜索,左边的数组即为{1,4};还是先找到数组的中间位置,这次因为是偶数,我们就取1吧(这里是按照自己取中间位置的算法实际去取),4比1小,那么要往右边数组搜索,右边数组即为{4};...原创 2019-11-18 07:25:27 · 1813 阅读 · 0 评论 -
详细讲解八大排序算法的思路和实现步骤
冒泡排序算法原理从集合的第1至n个元素,依次进行两两比较,出现前面一个元素比后面的大的情况就进行交换,即每次都把数值较大的元素放在后面,这样一轮下来,第n个元素就是集合中数值最大的元素了;接下来,就从第1至n-1,进行步骤1相同的操作,完成后第n-1个元素就第二大的元素了;继续重复这样的操作,直到元素都无需进行交换。(这其实是冒泡排序的一个小优化点,当出现所有元素都没有进行交换的时候,就...原创 2019-07-13 09:36:08 · 1537 阅读 · 0 评论