
数据结构
文章平均质量分 69
程人之美
这个作者很懒,什么都没留下…
展开
-
基于字符串的Hash表效率实验分析
关键词:Hash表,Hash函数,冲突解决。一、哈希表原理及运用1、定义:散列表(Hash table),即哈希表,是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它是通过计算一个关于键值的函数,将所需查询的数据映射到表中的一个位置来访问记录,因此这可以加快查找速度。这个映射函数被称作散列函数,存放记录的数组被称作散列表。 2、思想:Hash算法的主要思想就原创 2016-10-16 15:03:33 · 2894 阅读 · 1 评论 -
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间转载 2017-04-04 15:51:32 · 907 阅读 · 0 评论 -
字符串全排列
#include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std;set<string> res;void fun(string str, int pos) { if (str.length() == pos) { res.insert(str);原创 2017-04-03 15:55:34 · 245 阅读 · 0 评论 -
树的遍历
#include <iostream> #include <stack> #include <queue>using namespace std;typedef struct node { int data; node *left; node *right; node() { data = 0; left = NULL;原创 2017-03-24 22:52:25 · 269 阅读 · 0 评论 -
排序算法总结
#include <iostream> #include <cstring>using namespace std;void bubble(int *a, int length) { for (int i = 0; i < length; i ++) { for (int j = 0; j < length - i - 1; j ++) { if (a原创 2017-03-24 22:51:50 · 411 阅读 · 0 评论 -
基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms”
最近参加KDD Cup 2012比赛,选了track1,做微博推荐的,找了推荐相关的论文学习。“Item-Based Collaborative Filtering Recommendation Algorithms”这篇是推荐领域比较经典的论文,现在很多流行的推荐算法都是在这篇论文提出的算法的基础上进行改进的。 一、协同过滤算法描述 推荐系统应用数据分析技术,找出用转载 2017-03-21 00:54:11 · 1620 阅读 · 0 评论 -
图的邻接表和邻接矩阵
图的存储结构主要分两种,一种是邻接矩阵,一种是邻接表。 1.邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图。 从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵转载 2017-03-10 13:47:37 · 7694 阅读 · 0 评论 -
最短路径—Dijkstra算法和Floyd算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中,假转载 2017-03-10 12:25:20 · 407 阅读 · 0 评论 -
最小生成树Kruskal算法
克鲁斯卡尔(Kruskal)算法(只与边相关) 算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(eloge)。算法过程:1.将图各边按照权值进行排序2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。3.转载 2017-03-10 12:20:06 · 325 阅读 · 0 评论 -
最小生成树Prim算法理解
MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意转载 2017-03-10 11:41:48 · 389 阅读 · 0 评论 -
海量数据处理之Tire树(字典树)
参考博文:http://blog.youkuaiyun.com/v_july_v/article/details/6897097 第一部分、Trie树 1.1、什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效转载 2017-03-19 22:44:44 · 742 阅读 · 0 评论 -
前序中序后序遍历——递归与非递归实现
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说转载 2017-03-09 16:18:26 · 363 阅读 · 0 评论 -
KMP-字符串匹配算法
kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚。在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚。 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的转载 2017-03-09 00:08:50 · 278 阅读 · 0 评论 -
编辑距离
1. 编辑距离定义 今天我们来研究一个有趣的算法题,叫做字符串编辑距离。编辑距离研究的问题和最长公共子序列有相似之处,都是比较两个字符串之间的相似性,只是采用的标准不太相同。 先给出编辑距离的定义:设A和B是2个字符串,要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括: (1)删除一个字符(delete); (2)插入一个字符转载 2017-03-08 23:56:47 · 321 阅读 · 0 评论 -
动态规划算法
什么是动态规划? 动态规划(Dynamic Programming,所以我们简称动态规划为DP)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of opti转载 2017-03-17 16:49:11 · 640 阅读 · 0 评论 -
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
BST树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: BST树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小转载 2017-03-17 16:27:29 · 274 阅读 · 0 评论 -
栈与队列
1、栈的定义栈是限定仅在表尾进行插入和删除操作的线性表,Last In First Out。 注意: 线性表,栈元素具有线性关系,即前驱后继关系。2、两栈共享空间typedef struct { int data[MAXSIZE]; int top1; //stack1 栈顶指针 int top2; }SqDoubleStack; 两个栈的栈顶相对,top1原创 2017-03-02 21:10:19 · 221 阅读 · 0 评论 -
线性表
线性表(List)由零个或多个数据元素组成的有限序列: 线性表是一个序列。 若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。 线性表是有限的。 抽象数据类型数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。C语言中可分为原子类型和结构类型(例如数组)。抽象:抽取出事物具有的普遍性的本职。要求抽出问题的特征而忽略非本质的细节,是对具体事物的一原创 2017-02-09 11:34:36 · 235 阅读 · 0 评论 -
BitMap(位图) -处理海量数据
1K=1024byte 1M=1024K=1024*1024byte(约100万个字节) 1G=1024M=1024*1024K=1024*1024*1024byte(约10亿个字节) 假设现在有40亿个不重复且无序的无符号整数,现在给你一个整数让你快速判断它是否在这40亿个数里面???(假设现在只有4G的内存) 这道题的解决办法很简单,就是用这个数到这40个数中去找就行了,如果找到转载 2017-04-04 16:03:40 · 989 阅读 · 0 评论