常用算法
懒先森要努力
最淡的墨水也胜于最强的记忆
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Top K算法详细解析
问题描述:这是在网上找到的一道百度的面试题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复度比较 高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热门的10个查询 串,要求使用的内存不能超过1G。转载 2013-10-08 10:52:01 · 635 阅读 · 0 评论 -
算法优劣的评定标准(时间复杂度)
同一问题可用不同算法解决(比如同是创建一个有向图CreateGraph(G,v),选择邻接矩阵时间复杂度是O(n*n+n+e),而邻接表是O(n+e)),而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。 1、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必转载 2013-10-07 08:37:47 · 4789 阅读 · 0 评论 -
划分算法
1 划分算法思想2 代码实现3 时间复杂度4 讨论1 划分算法思想划分(partition)就是将数据项分成两组,一组大于某个特定的数据项,而另一组小于某个特定的数据项。在划分算法中,这个特定的数据项叫做枢纽(pivot)。划分算法的思想是中间线代表枢纽;数据项的左端和右端分别有两个指针(leftPtr和rightPtr); leftPtr从左向右遍历元素,righ转载 2013-10-07 08:37:04 · 1793 阅读 · 0 评论 -
浅谈编程解决实际问题的常见思想
现实生活中有很多问题,人为不好解决,但利用计算机速度快,不出错的特性,可以很方便的解决这些问题,下面简单说说我在程序设计中解决实际问题的一些常见思想,高手可以忽略掉,我也是无聊了随便写写而已。 1.枚举最优解时的情况 有很多问题初看很棘手,但经过仔细的分析,可以得出一些显然的结论。比如下面这个问题: 平面内有上千个点,用一个半径为R的圆去覆盖,最多能覆盖多少点?很多程序员最暴力的思转载 2013-10-04 21:05:42 · 1155 阅读 · 0 评论 -
【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这转载 2013-10-05 09:36:54 · 2375 阅读 · 0 评论 -
算法学习 - Dijkstra's Algorithm
1. Dijkstra's Algorithm是解决单源最短路径问题,即:从某个源点到其余各顶点的最短路径;2. Dijkstra's Algorithm中有两上关键点要注意(这是我学习的时候不仔细,导致走了很多弯路)。这里先明确两个集合:所有顶点集V和已选中顶点集S。 一、找到当前未选中点(V - S)中距离源点最近的点; 二、更新未选中点到源点的距离。3. 建议:结转载 2013-10-04 21:04:25 · 1085 阅读 · 0 评论 -
查找算法总结(三)
六、多路查找树、B~树、B+树 B树一种多路查找树(维基百科中定义):存储排序数据并允许以O(log n)的运行时间进行查找,顺序读取,插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。也可以说是 B- 或 B~树。 术语B树可以指一个特定的方案,也可以指大体上一类方案。狭义上,一个B树在它内部节点中存储键值,但不需在叶子节点上存储这些转载 2013-10-04 15:26:01 · 582 阅读 · 0 评论 -
查找算法总结(二)
接下来的几种算法属于动态查找结构三、二叉查找树: 特点: 1、如果它的左子树不空,那么左子树上的所有结点值均小于它的根结点值; 2、如果它的右子树不空,那么右子树上的所有结点值均大于它的根结点值; 3、它的左右子树也分别为二叉查找树。二叉查找树的插入和删除都非常的方便,很好的解决了折半查找添加删转载 2013-10-04 15:25:50 · 602 阅读 · 0 评论 -
查找算法总结(一)
静态查找结构主要有两种:顺序查找、折半查找一、顺序查找:这个就不用说了,一个一个的差吧,很差劲的算法了,时间复杂度是O(n) public int shunXuSearch( int[] b, int c) { for ( int i = 0; i length; i++) { if (b[i转载 2013-10-04 15:24:58 · 566 阅读 · 0 评论 -
链表排序
相比较线性表的排序而言,链表排序的内容稍微麻烦一点。一方面,你要考虑数据插入的步骤;另外一方面你也要对指针有所顾虑。要是有一步的内容错了,那么操作系统会马上给你弹出一个exception。就链表的特殊性而言,适合于链表的排序有哪些呢? (1)插入排序 (适合) (2)冒泡排序 (适合) (3)希尔排序 (适合) (4)选择排转载 2013-09-18 08:59:00 · 897 阅读 · 1 评论 -
通过金矿模型介绍动态规划
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节转载 2013-05-20 09:44:10 · 629 阅读 · 0 评论 -
二分查找的扩展
下面再附上三种版本的二分查找,分别是基本型,求相同值中下标最小的二分查找以及求相同值中下标最大的二分查找,注意这三者之间的微妙区别,如果能够彻底明白这些微妙的边界条件,那我想对于二分查找的精髓就算融会贯通了。#includeusing namespace std;//基本型的二分查找int bsearch(int a[],int l,int r,int key){ int m;转载 2013-03-02 21:04:28 · 505 阅读 · 0 评论 -
大数据的加法、减法、乘法以及阶乘的计算问题
限于数据类型的长度有限,对于大数据的计算就无能为力了,这里主要是采用字符数组解决精度问题。 加法、减法的思路差不多,主要就是采用我们固有的思维来计算,直接一位一位地相加。减法的话,先判断2个数的大小,让较大的数始终在前面,并且改变相应的数据长度,把结果放在一个临时的缓冲区里面。计算完毕后,再把数据写入到用户的缓冲区中,并且除去前面多余的0。乘法的计算就有点不同了,最大的转载 2013-10-21 15:11:07 · 1286 阅读 · 0 评论
分享