算法
文章平均质量分 80
gqtcgq
这个作者很懒,什么都没留下…
展开
-
Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or ri原创 2015-09-10 21:05:16 · 412 阅读 · 0 评论 -
Redis源码解析:18Hiredis同步API和回复解析API代码解析
Redis的sentinel模式使用了Hiredis代码,Hiredis是redis数据库一个轻量级的C语言客户端库。它实现的向Redis发送命令的API函数redisCommand,使用方法类似于printf。因此只要熟悉redis命令,就可以很容易的使用该函数将redis命令字符串,转换成统一请求协议格式之后,发送给Redis服务器。 Hiredis库包含三类API:同步操原创 2016-05-08 09:55:22 · 5987 阅读 · 3 评论 -
Libev源码分析03:Libev使用堆管理定时器
Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆。 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率比较低,说白了,就是违背了局部性原理。这是因为在2叉堆中,对元素的操作通常在N和N/2之间进行,所以对于含有大量元素的堆来说,两个操作数之间间隔比较远,对CPU缓存利用不太原创 2015-10-17 13:15:53 · 1837 阅读 · 0 评论 -
负载均衡的那些算法们
负载均衡的那些算法们by:简单的老王 上周发了问卷,想了解一下大家对老王有没有什么建议,然后好多朋友都投了票,想了解编程技术和服务器架构的干货,所以接下来会先聊聊编程和架构相关的算法,然后大概在6月下旬会跟大家聊聊面试那些事儿(老王到目前大约参加了几百次的面试,可以从面试官的角度来聊聊不一样的面试)。老王聊技术有个特点,就是绝不假大空,只求贴地飞行。所以,聊的东西一定会跟实际有关联转载 2016-07-31 09:20:47 · 1018 阅读 · 0 评论 -
负载均衡之加权轮询算法
在介绍加权轮询算法(WeightedRound-Robin)之前,首先介绍一下轮询算法(Round-Robin)。 一:轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法。它的原理是把来自用户的请求轮流分配给内部的服务器:从服务器1开始,直到服务器N,然后重新开始循环。 算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。原创 2016-07-31 09:30:10 · 41577 阅读 · 6 评论 -
算法导论笔记:32字符串匹配算法
在编辑文本程序中,经常需要在文本中找到某个模式的所有出现位置。典型的情况是:在一个文本文件中,搜索用户输入的关键字。解决这种问题的算法叫做字符串匹配算法。字符串匹配算法的形式化定义如下:假设文本是长度为n的数组T[1..n],而模式是一个长度为m的数组P[1..m],其中m<=n,P和T中的元素都来自优先字符集。比如∑ = {0,1}或者∑ ={a,b,...z}。字符数组P和T通常称为字符串原创 2015-05-11 21:34:25 · 703 阅读 · 0 评论 -
算法导论笔记:24单源最短路径
最短路径问题:一个带权重的有向图G = (V, E)和权重函数w: E->R,该权重函数将每条边映射到实数值的权重上。一条路径p的权重w(p)是构成该路径的所有边的权重之和,定义从节点u到结点v的最短路径权重δ (u, v)如下: 在实际应用中,可以用一张图表示道路交通图,结点代表城市,边代表城市之间的道路,边上的权重代表道路的长度。目标就是找出一条从城市A到城市B的最原创 2015-05-10 10:23:46 · 7206 阅读 · 0 评论 -
算法导论笔记:25所有节点对的最短路径问题
本章考虑在给定的有向加权图G=(V, E),对于所有的节点u,v∈V,找到一条从节点u到节点v的最短路径。希望以表格的形式表示输出:第u行第v列给出的是节点u到节点v的最短路径权重。 对于这个问题,如果是运行|V|次单源最短路径算法来解决所有节点对的最短路径问题,每一次使用一个不同的节点做为源节点。如果所有边的权值是非负的,可以采用Dijkstra算法。如果采用数组来实现最小优先队原创 2015-05-10 16:02:28 · 7340 阅读 · 0 评论 -
算法导论笔记:31数论算法
因为我们将处理一些大整数,所以需要调整一下如何看待输人规模和基本算术运算的代价的看法。 在本章中,一个“大的输入”意味着输入包含“大的整数”,而不是输人中包含“许多整数”。因此,我们将根据输入数的位数来衡最输人的规模,而不是仅根据输人中包含的整数的个数。在本章中,我们在分析算法时一般既考虑算术运算的次数,也考虑它们所要求的位操作的次数。 一:初等数论概念 一原创 2015-05-11 21:22:43 · 1538 阅读 · 0 评论 -
算法导论笔记:16贪心算法
动态规划方法求解最优化问题时,每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法来求解最优解有些杀鸡用牛刀了,可以使用更简单更高效的贪心算法。贪心算法在每一步的选择中,都选择当时最佳的情况。即局部最优的选择。贪心算法并不能保证总能得到最优解,但是很多问题确实可以求得最优解。 一:活动选择问题 多个活动调度竞争共享资源,目标是选出一个最大的互相兼容的活动集合。假设有原创 2015-05-09 10:12:17 · 5547 阅读 · 1 评论 -
Redis源码解析:04字典的遍历dictScan
dict.c中的dictScan函数,用来遍历字典,迭代其中的每个元素。该函数使用的算法非常精妙!!!所以必须记录一下。 遍历一个稳定的字典,当然不是什么难事,但Redis中的字典因为有rehash的过程,使字典可能扩展,也可能缩小。这就带来了问题,如果在两次遍历中间,字典的结构发生了变化(扩展或缩小),字典中的元素所在的位置相应的会发生变化,那如何保证字典中原有的元素都可以被原创 2016-01-17 20:46:59 · 3775 阅读 · 6 评论 -
翻转整数的二进制位
一个无符号的整数,如果需要翻转其二进制位,可以采用下面的方法,以32位整数为例:unsigned int v; // 32-bit word to reverse bit order// swap odd and even bitsv = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);// swap consecutive pai原创 2016-01-17 20:00:34 · 3585 阅读 · 0 评论 -
Text Justification
Given an array of words and a length L, format the text such that each line has exactly L characters and is fully(left and right) justified. You should pack your words in a greedy approach; t原创 2015-09-10 22:15:58 · 740 阅读 · 0 评论 -
sqrt函数实现
Implement int sqrt(int x). Compute and return the square root of x. 1:二分查找 思路:要实现一个sqrt函数,可以使用二分法,首先确定一个范围[begin, end],这个范围的中间数mid,看mid的平方是否等于x,如果相等,则返回mid,如果不等则缩小[begin,end]的范围,原创 2015-09-12 10:53:35 · 16443 阅读 · 2 评论 -
N-Queens
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.Given an integer n, return all distinct solutions to the n-queens puzzle.Eac原创 2015-08-22 15:25:02 · 505 阅读 · 0 评论 -
Spiral Matrix II
Given an integer n, generate a square matrix filled with elements from 1 to n^2 in spiral order. For example,Given n = 3,You should return the followingmatrix:[ [ 1, 2, 3 ], [ 8, 9, 4原创 2015-08-22 15:43:58 · 459 阅读 · 0 评论 -
Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times.原创 2015-08-23 10:51:38 · 477 阅读 · 0 评论 -
Permutation Sequence
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, for n = 3):"123""132""213"原创 2015-08-23 13:16:42 · 484 阅读 · 0 评论 -
Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up:Did you use extra space?A straight forward solution using O(mn) space is probably a原创 2015-09-14 12:46:21 · 684 阅读 · 0 评论 -
Sort Colors
Given an array with n objects colored red,white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the inte原创 2015-09-15 13:04:44 · 432 阅读 · 0 评论 -
Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:Integers in each row are sorted from left to right.The first integer of each row原创 2015-09-16 13:06:02 · 460 阅读 · 0 评论 -
算法导论笔记:17摊还分析
在摊还分析中,通过求数据结构的一系列的操作的平均时间,来评价操作的代价。这样,即使这些操作中的某个单一操作的代价很高,也可以证明平均代价很低。摊还分析不涉及概率,它可以保证最坏情况下每个操作的平均性能。 摊还分析有三种常用的技术: 聚合分析,它确定n个操作的总代价的上界为T(n),所以每个操作的平均代价为T(n)/n。每个操作都有相同的摊还代价。原创 2015-05-09 10:42:59 · 8287 阅读 · 2 评论 -
算法导论笔记:19斐波那契堆
可合并堆是支持以下5种操作的数据结构,其中每个元素都有一个关键字: MAKE-HEAP():创建和返回一个新的不含任何元素的堆。 INSERT(H, x):将一个已填入关键字的元素x插入堆H中。 MINIMUM(H):返回一个指向堆H中具有最小关键字元素的指针。 EXTRACT-MIN(H):从堆H中删除最小关键字的元素,并返回指向该原创 2015-05-09 16:36:40 · 6058 阅读 · 0 评论 -
算法导论笔记:15动态规划
动态规划(dynamic programming,这里的programming不是程序,而是表示表格)。它与分治算法类似,都是通过组合子问题的解来求解原问题。分治算法是将原问题分解为互不相交的子问题,递归的求解子问题,然后将解组合起来。 动态规划则不同,它应用于求解子问题重叠的情况,也就是不同的子问题会涉及相同的子子问题。这样,普通的递归方法会反复的求解那些公共子问题,因而浪费了时原创 2015-05-06 09:08:16 · 6900 阅读 · 1 评论 -
算法导论笔记:04最大子数组矩阵乘法以及递归式求解
最大子数组,给定数组,在这个数组中找到这样的子数组:子数组的和是所有子数组中最大的(子数组必须是连续的)。 typedef struct{int max;int subbegin;int subend;}SUBMAX;#define NEINFINITE (0x80000000)#define true 1#define false转载 2015-04-19 16:33:45 · 960 阅读 · 0 评论 -
算法导论笔记:21用于不相交集合的数据结构
在某些应用中,要将n个不同的元素分成一组不相交的集合。不相交集合上有两个重要操作,即找出给定的元素所属的集合和合并两个集合。 一:不相交集合的操作 不相交集合教据结构维护一组不相交的动态集合的集合S={S1, S2, ..., SK}。每个集合通过一个代表来识别,代表是集合中的某个成员,在某些应用中,哪一个成员被选作代表是无所谓的,但是必须保证在两次寻找某一集合原创 2015-05-09 16:48:06 · 1043 阅读 · 0 评论 -
算法导论笔记:13-02红黑树插入
红黑树的插入可在O(lg n)完成,红黑树的插入类似于二叉搜索树的插入,为了尽量维护红黑树的性质,将插入的新节点标记为RED,然后调用RB-INSERT-FIXUP对红黑树的性质进行维护,RB-INSERT代码如下: RB-INSERT(T,z) y = T.nil x = T.root原创 2015-04-26 18:02:40 · 556 阅读 · 0 评论 -
算法导论笔记:18B树
磁盘作为辅存,它的容量要比内存大得多,但是速度也要慢许多,下面就是磁盘的的结构图: 磁盘驱动器由一个或多个盘片组成,它们以固定的速度绕着主轴旋转,数据存储于盘片的表面,磁盘驱动器通过磁臂末尾的磁头来读写盘片。礠臂可以将磁头向主轴移近或移远。当一个磁头处于静止的时候,它下面经过的磁盘表面称为磁道。 磁盘之所以比主存要慢,是因为它有机械运动的部分:盘片旋原创 2015-05-09 13:05:12 · 797 阅读 · 0 评论 -
算法导论笔记:13-04红黑树以及其他平衡树
一:红黑树的其他特点 1:对于一颗用RB-INSERT插入n个结点形成的红黑树,如果n>1,则该树至少有一个红结点。 2: 如果用RB-INSERT将节点x插入一颗红黑树,然后接着用RB-DELETE删除,则结果红黑树是否和原始红黑树一样? 不一样,因为RB-INSERT可能会进行旋转而改变树的结构,比如; 二:AVL树原创 2015-04-26 18:32:02 · 987 阅读 · 0 评论 -
算法导论笔记:03渐进符号
1:Θ记号: 对一个给定的函数g(n),用Θ(g(n))来表示以下函数的集合:Θ(g(n))={f(n):存在正常量c1、c2 和 n0,使得对所有n≥n0,有0≤c1g(n)≤f(n)≤c2g(n)} 称g(n)是f(n)的一个渐近紧确界(asymptotically tight bound)。 2:O符号 当只有一个渐近上原创 2015-04-19 16:23:54 · 1181 阅读 · 0 评论 -
算法导论笔记:14数据结构的扩张
一:概述 一些工程应用只会使用教科书式的标准数据结构,但是也会有些应用需要对现有的数据结构进行少许的创新和改造,只有很少的情况会创造全新的数据结构。 二:动态顺序统计 顺序统计:n个元素中第i个顺序统计量,就是具有第i小关键字的元素。对于一个无序的集合,可以在O(n)的时间内得到任意的顺序统计量。 利用红黑树,可以在O(lg原创 2015-04-27 21:27:28 · 772 阅读 · 0 评论 -
算法导论笔记:13-03红黑树删除
红黑树的删除操作花费O(lg n)时间,删除算法与二叉搜索树的删除类似,首先红黑树的TRANSPLANT版本有些许不同,主要是因为红黑树使用nil结点代替NULL指针造成的:RB-TRANSPLANT(T, u, v) if u.p ==T.nil T.root= v else if u== u.p.left原创 2015-04-26 18:11:59 · 932 阅读 · 0 评论 -
算法导论笔记:23最小生成树
一个连通无向图G=(V, E),每条边(u, v) ∈ E,都有权重w(u, v),希望找到一个无环子集TE,既能够将所有节点都连接起来,又具有最小的权重。由于T是无环的,并且能连接所有的节点,所以T必然是一棵树,成T为最小生成树。最小生成树不唯一。 一:最小生成树的形成 本章所讨论的两种算法都采用贪心策略,这个贪心策略由下面的通用算法描述: GENER原创 2015-05-10 09:34:05 · 1777 阅读 · 0 评论 -
算法导论笔记:13-01红黑树概念与基本操作
因二叉搜索树的字典操作的时间复杂度都是O(h),所以,当二叉搜索树的高度较小时,可以获得较快的执行。只有当二叉搜索树变得“平衡”时,高度才会达到最低。 红黑树是许多“平衡”搜索树中的一种,可以保证在最坏情况下基本动态集合操作的时间为O(lg n)。 一:概念与性质 红黑树是一种二叉搜索树,同时它又具有其他的性质。红黑树的结点具有颜色属性,分别为RED或者原创 2015-04-26 17:47:09 · 724 阅读 · 0 评论 -
算法导论笔记:22基本图算法
本章阐述图的表示方法和图的搜索方法。图的搜索指的是系统化的沿着图的边访问所有顶点。图的搜索算法可以用来发现图的结构。许多图的算法在开始时,都是通过搜索获取图结构信息。另外还有一些图的算法实际上是由基本的图搜索算法经过简单扩充而成的。因此。图的搜索技术是图算法领域的核心。 一:图的表示 对于图G=(V, E),可以有两种表示方法:邻接链表和邻接矩阵。两种表示方法既可以表示原创 2015-05-10 08:58:18 · 3002 阅读 · 0 评论 -
算法导论笔记:05随机问题
4:用RANDOM(0,1)实现RANDOM(a,b): 这道题的实现思路:这个题目相当于在能随机生成 0, 1 的前提下,要求随机生成 n=b-a+1 个整数。 1、把要生成的数标记为 a, a+1, a+2,..., b-a+1,…,b-1,b 2、取最小的 m,使得2^m >= n转载 2015-04-19 17:34:08 · 531 阅读 · 0 评论 -
算法导论笔记:06堆排序
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点(也可以这样理解,除叶子节点外的所有结点均有两个子结点。节点数达到最大值。所有叶子结点必须在同一层上) 1:堆排序的时间复杂度为O(nlgn)。具有空间原址性的特点,也就是任意时刻只需常数个额外元素空间存储临时数据。 2:堆是一颗近似完全二叉树:除了最底层外,该树是完全充满的,最底层是从原创 2015-04-22 21:16:53 · 1100 阅读 · 0 评论 -
算法导论笔记:07快速排序
1:快速排序 快速排序的最坏情况时间复杂度为Θ(n^2)。虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能很好。它的期望运行时间复杂度为Θ(n lg n),而且Θ(n lg n)中蕴含的常数因子非常小,而且它还是原址排序的。 2:基本思想 快速排序采用分治法进行排序,首先在数组中选择一个元素P,根据元素P将数组划分原创 2015-04-22 21:41:50 · 608 阅读 · 0 评论 -
算法导论笔记:08线性排序
之前的排序算法都是比较排序:在排序的最终结果中,各元素的次序依赖于他们之间的比较。任何比较排序在最坏情况下,都要经历Ω(n lgn)次比较,所以,归并排序和堆排序都是渐进最优的。 除了比较排序之外,还有其他的排序方法,但是都必须满足一定的前提条件,这些排序算法的下界不再是Ω(n lgn),而可以达到线性的下界。 1:决策树模型 比较排序可以抽象成一颗决策树,原创 2015-04-23 22:28:03 · 581 阅读 · 0 评论 -
算法导论笔记:09中位数和顺序统计量
1:n个元素组成的集合,第i个顺序统计量,就是该集合中第i小的元素。所以,集合中的最小值就是第1个顺序统计量,最大值就是第n个顺序统计量。中位数是所属集合的“中点元素”,当n是奇数的时候,中位数唯一,位于(n+1)/2处。如果n是偶数,中位数有两个,分别位于n/2和(n/2) + 1。 2:选择问题,就是选择第i个顺序统计量的问题。如果利用排序的话,那最快可以在O(n原创 2015-04-23 22:41:41 · 1218 阅读 · 0 评论