常用算法
Ansel_m
阿里天猫
展开
-
BinarySearch
public int indexOf(int[] array, int data) { if (array == null || array.length == 0) { return -1; } int begin = 0; int end = array.length; while (begin < end) { int mid = (begin + ...原创 2020-05-14 15:36:48 · 169 阅读 · 0 评论 -
斐波那契数
//性能差 时间复杂度:2的n次方- (NSUInteger)fibonacci1:(NSUInteger)number { if (number <= 1) { return number; } return [self fibonacci1:number - 1] + + [self fibonacci1:number - ...原创 2020-04-25 00:28:00 · 820 阅读 · 0 评论 -
(七)图的邻接多重表存储法(超详细)
前面讲过,无向图的存储可以使用邻接表,但在实际使用时,如果想对图中某顶点进行实操(修改或删除),由于邻接表中存储该顶点的节点有两个,因此需要操作两个节点。为了提高在无向图中操作顶点的效率,本节学习一种新的适用于存储无向图的方法——邻接多重表。注意,邻接多重表仅适用于存储无向图或无向网。邻接多重表存储无向图的方式,可看作是邻接表和十字链表的结合。同邻接表和十字链表存储图的方法相同,都是独自...转载 2019-03-20 18:56:46 · 844 阅读 · 0 评论 -
(六)图的十字链表存储法详解
与邻接表不同,十字链表法仅适用于存储有向图和有向网。不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题。十字链表存储有向图(网)的方式与邻接表有一些相同,都以图(网)中各顶点为首元节点建立多条链表,同时为了便于管理,还将所有链表的首元节点存储到同一数组(或链表)中。其中,建立个各个链表中用于存储顶点的首元节点结构如图 1 所示:图 1 十字链表中首元节点结构示意图从图 1 可...转载 2019-03-20 16:46:51 · 2936 阅读 · 2 评论 -
最大连续子序列之和
- (NSInteger)sumOfLargestConsecutiveSubsequenceForIntArray:(NSArray<NSNumber *> *)array { if ([array count] <= 0) { return 0; } NSInteger sum = [array[0] integer...转载 2019-03-14 10:26:20 · 188 阅读 · 0 评论 -
动态规划解最长公共子序列(LCS)
子序列形式化定义:给定一个序列X=<x1,x2,x3,x4...,xm>,另一个序列Z=<z1,z2,z3,z4...,zk>,若存在一个严格递增的X的下标序列<i1,i2,i3,...,ik>对所有的1,2,3,...,k,都满足x(ik)=zk,则称Z是X的子序列比如Z=<B,C,D,B>是X=<A,B,C,B,D,A,B>的子...转载 2019-03-14 09:43:02 · 179 阅读 · 0 评论 -
【数据结构和算法05】 红-黑树(看完包懂~)
二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项。但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,但如果插入的是有序或者逆序的数据,那么二叉搜索树的执行速度就变得很慢。因为当插入数值有序时,二叉树就是非平衡的了,排在一条线上,其实就变成了一个链表……它的快速查找、插入和删除指定数据项的能力就丧失了。为了能以较快的时间 ...转载 2019-02-25 16:09:43 · 166 阅读 · 0 评论 -
插入排序 (Insertion Sort)
算法原理设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。具体算法描述如下:从第一个元素开始,该元素可以认...转载 2019-02-11 15:56:18 · 198 阅读 · 0 评论 -
布隆过滤器 (Bloom Filter) 详解
原文链接:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html 布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中...转载 2019-02-11 15:15:00 · 298 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)的原理和实现
布隆过滤器使用场景之前在《数学之美》里面看到过布隆过滤器的介绍。那么什么场景下面需要使用布隆过滤器呢?看下下面几个问题字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能以上这些场景有个共同的问题:如何查看一个东西是否在有大量数据的池子里面。...转载 2019-02-11 15:06:44 · 194 阅读 · 0 评论 -
最通俗易懂的01背包问题讲解
1、动态规划(DP) 动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复计算过程。 另外,DP在求解一个问题最优解的时候,不是固定的计算合并某些子问题的解,而是根据各子问题的解的情况选择其中最优的。 动态规划求解具有以下的性质: 最优子结构性质、子问题...转载 2019-03-21 11:48:06 · 743 阅读 · 0 评论 -
最小生成树-Prim算法
Prim算法1.概览普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英...转载 2019-03-21 13:15:38 · 1295 阅读 · 0 评论 -
(一) 什么是图存储结构
阅读:1,220 作者:解学武(数据结构)图的存储结构完全攻略图什么是连通图我们知道,数据之间的关系有 3 种,分别是 "一对一"、"一对多" 和 "多对多",前两种关系的数据可分别用线性表和树结构存储,本节学习存储具有"多对多"逻辑关系数据的结构——图存储结构。图 1 图存储结构示意图图 1 所示为存储 V1、V2、V3、V4 的图结构,从图中可以清楚的看...转载 2019-03-18 11:36:52 · 3026 阅读 · 1 评论 -
跳跃表原理
最近看了一种数据结构叫做skipList,redis和levelDB都是用了它。Skip List是在有序链表的基础上进行了扩展,解决了有序链表结构查找特定值困难的问题,查找特定值的时间复杂度为O(logn),他是一种可以代替平衡树的数据结构。 下面是skipList的一个介绍,转载来的,源地址:http://kenby.iteye.com/blog/1187303,为防止...转载 2019-03-29 10:36:29 · 142 阅读 · 0 评论 -
图文翔解HashTree
在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。之前我们介绍的各种基于比较的树查找算法,这些查找算法的效率都将随着数据记录数的增长而下降。仅仅是有的比较慢(时间复杂度为O(n)),有的比较快(时间复杂度是O(logn))而已。这些查找算法的...转载 2019-04-10 10:39:50 · 231 阅读 · 0 评论 -
Dijkstra 最短路算法
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”。本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的 1 号顶点到 2、3、4、5、6 号顶点的最短路径。与 Floyd-Warshall 算法一样这里仍然使用二维数组 e 来存储顶点之间边的关系,初始值如下。我们还需要用一个一...转载 2019-03-26 10:40:06 · 214 阅读 · 0 评论 -
Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法。该算法由Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年,而实际上 Edward F. Moore 也在 1957 年发布了相同的算法,因此,此算法也常被称为 Bellman-Ford-Moore 算法...转载 2019-03-26 10:15:42 · 1392 阅读 · 0 评论 -
dijkstra算法:寻找到全图各点的最短路径
dijkstra算法介绍:即迪杰斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先的搜索方法。dijkstra算法原理:最优子路径存在。假设从S→E存在一条最短路径SE,且该路径经过点A,那么可以确定SA子路径一定是S→A的最短路径。证明:反证法。如果子路径SA不是最短的,那么就必...转载 2019-03-22 11:42:31 · 1806 阅读 · 0 评论 -
(五)图的邻接表存储法详解
通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表、邻接多重表和十字链表。本节先讲解图的邻接表存储法。邻接表既适用于存储无向图,也适用于存储有向图。在具体讲解邻接表存储图的实现方法之前,先普及一个"邻接点"的概念。在图中,如果两个点相互连通,即通过其中一个顶点,可直接找到另一个顶点,则称它们互为邻接点。邻接指的是图中顶点之间有边或者弧的存在。邻接表存储图的实现方式是,...转载 2019-03-18 11:49:59 · 2736 阅读 · 0 评论 -
(四)图的顺序存储结构及C语言实现
使用图结构表示的数据元素之间虽然具有“多对多”的关系,但是同样可以采用顺序存储,也就是使用数组有效地存储图。使用数组存储图时,需要使用两个数组,一个数组存放图中顶点本身的数据(一维数组),另外一个数组用于存储各顶点之间的关系(二维数组)。存储图中各顶点本身数据,使用一维数组就足够了;存储顶点之间的关系时,要记录每个顶点和其它所有顶点之间的关系,所以需要使用二维数组。不同类型的图,存储的方...转载 2019-03-18 11:38:50 · 1177 阅读 · 0 评论 -
(三)什么是生成树,生成树(生成森林)详解
在学习连通图的基础上,本节学习什么是生成树,以及什么是生成森林。对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树。图 1 连通图及其对应的生成树如图 1 所示,图 1a) 是一张连通图,图 1b) 是其对应的 2 种生成树。连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往一张连通图可能有多种不同的生成树与之对应。连通图...转载 2019-03-18 11:38:05 · 5725 阅读 · 2 评论 -
简单剖析B树(B-Tree)与B+树
注意:首先需要说明的一点是:B-树就是B树,没有所谓的B减树引言 我们都知道二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗? 答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内...转载 2019-02-01 16:14:21 · 246 阅读 · 0 评论 -
NSMutableArray Merge Sort
#import @interface NSMutableArray (MergeSort)- (void)mergeSortUsingComparator:(NSComparator)comparator;@end#import "NSMutableArray+MergeSort.h"@implementation NSMutable原创 2017-06-20 17:10:39 · 231 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 这道题目比较数组组成字符之后的大小,所以很自然的想到了大数问题。所以整个过程都要使用字符串来比较和保存。思路: 并不是a313,所以我们应该设置自己的一套比较规则,如果ab转载 2017-06-06 15:28:35 · 307 阅读 · 0 评论 -
n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。方法一:递归思路:设n个骰子某次投掷点数和为s的出现次数是F(n, s),那么,F(n, s)等于n - 1个骰子投掷的点数和为s - 1、s - 2、s - 3、s -4、s - 5、s - 6时的次数的总和:F(n , s) = F(n - 1, s - 1) + F(n - 1转载 2017-06-06 15:12:16 · 284 阅读 · 0 评论 -
从1到n整数中1出现的次数:O(logn)算法
1. 题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。2. 题目来源第一次看到是在《剑指Offer》第2版上,面试题32。leetcode和牛客网上都有这道题。3. 本文的目的看了《剑指Offer》上的解法,我觉得不能算好:这段解释描述有些不清晰,而且没有图,转载 2017-06-06 15:04:55 · 239 阅读 · 0 评论 -
寻找最长01字串(转自待字闺中)
给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的。例1:10101010 结果就是其本身。例2:1101000 结果是110100这个题目,看起来比较简单,一些同学可能认为题目的描述符合动态规划的特征,然后就开始用动态规划解,努力找状态转移方程。这些同学的感觉,是很正确的。但,找状态转移方程,我们要对原来的数组进行变换一下。原来是0和1转载 2015-10-08 09:09:45 · 776 阅读 · 0 评论 -
quick sort
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速转载 2014-07-05 11:06:21 · 721 阅读 · 0 评论 -
冒泡排序
//冒泡是相邻的两个数比较void bubble_sort_low(int unsorted[],int count) //低级{ for (int i = 0; i1; i++) { //比较的趟数 printf("-----------------\n"); for (int j=0; j1-i; j++) {原创 2014-07-04 10:21:34 · 789 阅读 · 0 评论 -
选择排序
#include void selection_sort(int unsorted[],int count){ for (int i = 0; i 1; i++) { int min = unsorted[i], min_index = i; for (int j = i; j if (unsorte原创 2014-07-04 09:40:19 · 679 阅读 · 0 评论 -
NSMutableArray Heap Sort
@interface NSMutableArray (HeapSort)- (void)heapSortUsingComparator:(NSComparator)comparator;@end#import "NSMutableArray+HeapSort.h"@implementation NSMutableArray (HeapSort)- (void)heapSortUsi...转载 2017-06-20 21:47:41 · 174 阅读 · 0 评论 -
堆排序原理及算法实现(最大堆)
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>转载 2017-06-05 16:24:05 · 329 阅读 · 0 评论 -
二叉查找树--查找、删除、插入(Java实现)
二叉查找树 二叉查找树(Binary Search Tree),或者是一颗空树,或者是具有下列性质的二叉树: 1、若它的左子树不空,则其左子树上的所有结点的值均小于它根结点的值; 2、若它的右子树不空,则其右子树上的所有结点的值均大于它根结点的值;转载 2017-08-24 20:40:38 · 776 阅读 · 0 评论 -
图解堆排序
摘要: 作为选择排序的改进版,堆排序可以把每一趟元素的比较结果保存下来,以便我们在选择最小/大元素时对已经比较过的元素做出相应的调整。 堆排序是一种树形选择排序,在排序过程中可以把元素看成是一颗完全二叉树,每个节点都大(小)于它的两个子节点,当每个节点都大于等于它的两个子节点时,就称为大顶堆,也叫堆有序; 当每个节点都小于等于它的两个子节点时,就称为小顶堆。 ...转载 2018-10-24 10:21:32 · 243 阅读 · 0 评论 -
海量数据处理:十道面试题与十个海量数据处理方法总结
出处:http://blog.csdn.net/v_JULY_v。 第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小转载 2017-09-02 18:23:05 · 298 阅读 · 0 评论 -
海量数据处理面试题(1) 找出两文件种包含的相同的url
问题:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?分析:50亿个url,每个url64字节,就是320G,显然是无法一次读入内存的。因此这里需要采用分治法。方案:分治法,分支方法:哈希步骤:如图所示:1 将AB两个文件,用相同的哈希函数,分解为1000个独立哈希值相同的小文件,这里转载 2017-09-02 18:02:37 · 2603 阅读 · 4 评论 -
哈希树
我们选择质数分辨算法来建立一棵哈希树。选择从2开始的连续质数来建立一个十层的哈希树。第一层结点为根结点,根结点下有2个结点;第二层的每个结点下有3个结点;依此类推,即每层结点的子节点数目为连续的质数。到第十层,每个结点下有29个结点。如下图所示:同一结点中的子结点,从左到右代表不同的余数结果。例如:第二层结点下有三个子节点。那么从左到右分别代表:除3余0,除3余1,除3转载 2017-08-30 20:24:19 · 490 阅读 · 0 评论 -
Trie树详解
字典树(Trie)笔记特别声明本文只是一篇笔记类的文章,所以不存在什么抄袭之类的。以下为我研究时参考过的链接(有很多,这里我只列出我记得的):Trie(字典树)的应用——查找联系人trie树Trie树:应用于统计和排序牛人源码,研究代码来源1、字典树的概念字典树,因为它的搜索快捷的特性被单词搜索系统使用,故又称单词查找树。它是一种树形结构的数据结构。之所以快速,转载 2017-08-30 23:33:30 · 252 阅读 · 0 评论 -
动态规划 最长公共子序列 过程图解
1.基本概念 首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:转载 2017-08-29 23:02:04 · 768 阅读 · 0 评论 -
动态规划之背包问题
动态规划是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。动态规划往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。动态规划基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态转载 2017-08-29 20:41:18 · 301 阅读 · 0 评论