当前搜索:

[算法系列]算法一 地理空间距离计算优化

1. 地理空间距离计算面临的挑战打开美团app,不管是筛选团购还是筛选商家,默认的排序项都是“离我最近”或者“智能排序”(如下图所示):不管是“离我最近”还是“智能排序”,都涉及到计算用户位置与各个团购单子或者商家的距离(注:在智能排序中距离作为一个重要的参数参与排序打分)。以筛选商家为例,北京地区有5~6w个POI(本文将商家称之为POI),当用户进入商家页,请求北京全城+所有品类+离我最近/智...
阅读(206) 评论(0)

算法精品文选

[算法系列之一]堆排序 (sjf0115) [算法系列之二]二叉树各种遍历 (sjf0115) [算法系列之三]二叉树中序前序序列(或后序)求解树 (sjf0115) [算法系列之四]优先级队列 (sjf0115) [算法系列之五]快速排序 (sjf0115) [算法系列之六]二叉查找树 (sjf0115) [算法系列之七]Manacher算法之最大回文子串 (sjf0115) [算...
阅读(2140) 评论(0)

[算法系列之三十二]1的数目

题目Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.For example: Given n = 13, Return 6, because digit 1 occurred in the following num...
阅读(1097) 评论(0)

[算法系列之三十]Dijkstra单源最短路径算法

单源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。前面Bellman-Ford最短路径算法讲了单源最短路径的Bellman-Ford算法(动态规划算法)。这里介绍另外一个更常见的算法Dijkstra算法。Dijks...
阅读(1785) 评论(0)

[算法系列之二十九]Bellman-Ford最短路径算法

单源最短路径给定一个图,和一个源顶点src,找到从src到其它所有所有顶点的最短路径,图中可能含有负权值的边。Dijksra的算法是一个贪婪算法,时间复杂度是O(VLogV)(使用最小堆)。但是迪杰斯特拉算法在有负权值边的图中不适用,Bellman-Ford适合这样的图。在网络路由中,该算法会被用作距离向量路由算法。Bellman-Ford也比迪杰斯特拉算法更简单和同时也适用于分布式系统。但Bell...
阅读(2451) 评论(0)

[算法系列之二十九][背包问题]01背包

题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要...
阅读(888) 评论(0)

[算法系列之二十八]并查集(不相交集合)

一 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构:Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。 Union:将两个子集合并成同一个集合。 因为它支持这两种操作...
阅读(2206) 评论(0)

[算法系列之二十七]Kruskal最小生成树算法

简介求最小生成树一共有两种算法,一个是就是本文所说的Kruskal算法,另一个就是Prime算法。在详细讲解Kruskal最小生成树算法之前,让我们先回顾一下什么是最小生成树。我们有一个带权值的图,我们要求找到一个所有生成树中具有最小权值的生成树。如下图所示,T是图G的生成树。但不是具有最小权值的生成树。我们可以把他们想象成一组岛屿和连接它们的可能的桥梁。当然修桥是非常昂贵和费时的,所以我们必须要知...
阅读(1610) 评论(0)

[算法系列之二十六]字符串匹配之KMP算法

一 简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。二 基于部分匹配表的KMP算法举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含搜索串...
阅读(1332) 评论(0)

[算法系列之二十五]Ukkonen后缀树算法

所以我们从左边开始,第一次只插入单字符”a”,通过创建一个从根节点到一个叶节点的边(根节点左边),并且标记这条边[0,#],意思是说这条边代表了从0开始到当前末尾的子串。我使用#来表示当前末尾,当前末尾处在位置1(a的右边)。因此,我们拥有一棵起始树,图示如下:图示意思为:插入单字符”b”。当前末尾位置前进到位置2(b的右边)。 我们每步的目的是就是把所有的前缀都插入到当前位置(Our goal a...
阅读(2057) 评论(0)

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树。有了这些基础我们就能更好的理解后缀树了。一 引言 模式匹配问题给定一个文本text[0…n-1], 和一个模式串 pattern[0…m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m)。这个问题已经有两个经典的算法:...
阅读(2378) 评论(0)

[算法系列之二十三]线段树(Interval Tree)

一 背景在信息学竞赛中,我们经常会碰到一些跟区间有关的问题,比如给一些区 间线段求并区间的长度,或者并区间的个数等等。这些问题的描述都非常简单,但是通常情况下数据范围会非常大,而朴素方法的时间复杂度过高,导致不能在规定时间内得到问题的解。这时,我们需要一种高效的数据结构来处理这样的问题,在本文中,我们介绍一种基于分治思想的数据结构—-线段树。二 简介线段树是一种二叉树形结构,属于平衡树的一种。它将...
阅读(4531) 评论(0)

[算法系列之二十二]包含T全部元素的最小子窗口

题目描述给定一个包含一系列字符的集合T和字符串S,请在字符串S中找到一个最小的窗口,这个窗口中必须包含T中的所有字符。 例如, S = “ADOBECODEBANC” T = “ABC”最小窗口是“BANC”分析这是一个有趣的问题,这个有趣的问题有多种方法来解决,最好的方法是非常简单,美丽的。 在这篇文章中,我首先说明了一个方法,是我第一次遇见这个问题时想到的。我的第一个方法有点复杂,同时也...
阅读(2214) 评论(0)

[算法系列之二十一]最短摘要的生成

题目描述你我在百度或谷歌搜索框中敲入本博客名称的前4个字“结构之法”,便能在第一个选项看到本博客的链接,如下图2所示: 图2 谷歌中搜索关键字“结构之法”在上面所示的图2中,搜索结果“结构之法算法之道-博客频道-CSDN.NET”下有一段说明性的文字:“程序员面试、算法研究、编程艺术、红黑树4大经典原创系列集锦与总结 作者:July–结构之法算法…”,我们把这段文字称为那个搜索结果的摘要,亦即...
阅读(1295) 评论(0)

[算法系列之二十]字典树(Trie)

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。二 优点利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。三 性质(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符; (2)从根节点到某一节点,路径上经过的字符连接起来,为...
阅读(3509) 评论(0)

[算法系列之十九]最长公共子序列

有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它们同时是S1和S2的子串,且要求它们的长度最长,并确定这个长度。这个问题我们称之为最长公共子序列问题。 与求最长递增子序列一样,我们首先将原问题分割成一些子问题,我们用dp[i][j]表示S1中前i个字符和S2中前j个字符分别组成的两个前缀字符串的最长公共子串长度。显然的,当i,j较小时我们可以直接给出答案,如dp...
阅读(1496) 评论(0)

[算法系列之十八]海量数据处理之BitMap

一:简介所谓的BitMap就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节省。二:基本思想我们用一个具体的例子来讲解,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用BitMap的方法来达到排序的目的。要表示8个数,我们就只需要8个bit(1Bytes)。...
阅读(2120) 评论(0)

[算法系列之十七]数据压缩之位图

在之前的文章([算法系列之十六]数据压缩之游程编码)中,我们知道了如何压缩一段重复元素组成的数据。这种压缩称为“游程编码”,该算法在无损数据压缩传输时非常方便。但问题是数据必须遵循特定格式。比如,字符串“aaaaaaaabbbbbbbb”可以被压缩成“a8b8”。此时,16个字符的字符串被压缩成4个字符,没有丢失任何信息,而长度却只有原始长度的25%。但当字符(元素)以不同方式分散时,问题就会出...
阅读(1611) 评论(0)

[算法系列之十六]数据压缩之游程编码

无论现在计算机和网络的速度有多快,用户始终要求更快速的体验。为了降低传输数据的容量,我们通常会对数据进行压缩。这就是计算机科学领域一直是研究和发展的焦点的原因。数据压缩算法有很多,有些是无损的,有些是有损的,但是它们的主要目标都是降低存储空间和传输量。对于两个远距离节点之间的数据传输,这些压缩算法非常有用。也许最直观的例子就是web服务器和浏览器之间的数据传输。在过去的几年里做了很多关于文件压缩...
阅读(2024) 评论(0)

[算法系列之十五]Strassen矩阵相乘算法

Strassen矩阵乘法是一种典型的分治算法。目前为止,我们已经见过一些分治策略的算法了,例如归并排序和Karatsuba大数快速乘法。现在,让我们看看分治策略的背后原理是什么。同动态规划不同,在动态规划中,为了得到最终的答案,我们需要把一个大的问题“展开”为几个子问题(“expand” the solutions of sub-problems),但是在这里,我们会更多的谈到如何把一些子解决方...
阅读(1740) 评论(0)
45条 共3页1 2 3 下一页 尾页
    个人资料
    • 访问:1379387次
    • 积分:21340
    • 等级:
    • 排名:第398名
    • 原创:623篇
    • 转载:133篇
    • 译文:60篇
    • 评论:182条
    博客专栏
    文章分类
    最新评论