随笔分类 - 数据结构
摘要:虽然做了笔记,但还老是忘,因为不常使用吗? 1. 海量数据处理 常见的问题如下: 10亿篇文章,如何找出其中出现次数最多的100个词(Trim树) 10亿个数字,取最小的100个数(Top K) 在2.5亿个整数中找出不重复的整数(重复问题) 两个大文件,找出交集?(利用Top K问题,使用相同的h
阅读全文
摘要:面试题海量数据处理经常出现BitMap,所以记一下笔记 1. BitMap BitMap也称为位图,其原理和布隆过滤器类似,其基本原理都是使用位数组及其下标来表示某些元素是否存在,其在处理大量数据的 排序、查询、去重 ,以及 在用户群做交集和并集运算 的时候也有极大的便利 假如我们要将 {5,6,1
阅读全文
摘要:1. 递归实现 先序 public void preOrder(){ preOrder(root); } private void preOrder(Node node){ if(node != null){ System.out.println(node.value); preOrder(node
阅读全文
摘要:1. 堆 堆是完全二叉树的数组形式,由于堆没有指针指向,所以可以利用下标来模拟指向,假设 i 为父节点,那么 2i+1 为左孩子,2i+2 为右孩子。假设 i 为当前节点,那么 (i 1) / 2 为父节点 根据大小排序可分为小根堆和大根堆,小根堆即元素越小越在上方,大根堆则相反。 这里注意:元素大
阅读全文
摘要:在看数据结构时发现图的这章没怎么看,赶紧瞅瞅,下面以二叉树为例说明 1. 树的结构 为了方便读者查看简洁的DFS和BFS逻辑,这里把树的基本结构统一抽取出来且不讨论树的实现 2. DFS 深度优先搜索,从某个初始点出发,首先访问初始点,然后选择一个与该点相邻且没有访问过的点,接着以该相邻点为初始点,
阅读全文
摘要:在Redis的缓存穿透中了解到布隆过滤器,不禁想了解其奇妙之处 1. 布隆过滤器的作用 判断传入数据是否已经存在,由这个基本功能可以泛生出: 防止Redis缓存穿透 海量数据去重 垃圾邮件过滤 2. 什么是布隆过滤器 布隆过滤器(Bloom Filter)是1970年由一个叫布隆的人提出的,它本质是
阅读全文
摘要:笔者埋坑后面再来分析总结 1. 插入排序 直接插入排序:O(n^2) 二分插入排序:O(n^2) 希尔排序:O(nlog n) 2. 交换排序 冒泡排序:O(n^2) 快速排序:O(nlog2 n) java public static void SimpleSelectSort(int[] arr
阅读全文
摘要:1. 哈希表的基本概念 哈希表又称散列表,若要存储的元素个数为n,设置一个长度为m(m = n)的连续内存单元,以每个元素的关键字为自变量,通过一个称为哈希的函数把关键字映射为内存单元地址(或下标),并将该元素存储在这个内存单元中,而这个内存单元的值也称为哈希地址,这样构造出来的线性存储结构称为哈希
阅读全文
摘要:B 树 B树是二叉平衡树的升级版,可以多路自平衡,而且属于外查找,即数据是放在外存之中的,这时候就要考虑 IO 操作优化了,相比二叉查找树他们的时间复杂度都是O(log N),优势在于B树的深度相比小很多,在数据很大的情况下从磁盘读取次数小了,加快了查找速度,所以B树及其同类经常用在文件系统或数据库
阅读全文
摘要:定义 是一个特殊的 "二叉查找树" 任何结点的两个子树的高度差小于等于1 前5个函数为后面的功能做铺垫,一般的树都有这些函数 1. 结点 2. 树高 3. 比大小 4. 找最值及其结点 5. 查找 6. 旋转 为了实现任何结点的左右子树高度差小于等于1,就要用 使树达到平衡,而旋转分为,左左旋转,右
阅读全文
摘要:1. 定义(Binary Sort Tree) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值 任意节点的左、右子树也分别为二叉查找树 没有键值相等的节点 简单来说:任意节点的根比左子树大,比右子树小,O(log2
阅读全文
摘要:1. 二叉树 二叉树是一个有限结点的集合,该集合或者为空集,或者由一个根结点和两棵互不相交的称为左子树和右子树的二叉树组成, 简单理解: 每个结点最多可有两棵子树(即0,1,2棵) 特点 每个结点最多有两颗子树 左右子树是有顺序不能任意颠倒 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树
阅读全文
摘要:1. 递归的定义 在定义一个函数时出现调用本函数的过程称为递归。 1.1 以下为求 n! 的递归函数,理解一下递归 1.2 递归的过程(举例求 5 的阶乘 fun(5) ) 递归是代码共享的,也就是用同一个函数的代码,系统会为每一次调用开辟一组储存单元来存放本次调用的返回地址和被中断的函数的参数值。
阅读全文
摘要:1. 字符串的定义 字符串是由零个或多个字符组成的有限序列。其中最外边的双引号(或单引号)不是串的内容,它们是串的标志。 2. 字符串的存储结构及其基本运算 分为顺序和链式储存结构,这里笔者只列出顺序串 2.1 顺序串 2.1.1 串的复制 c bool StrEqual(String s,Stri
阅读全文
摘要:1.栈 1.1栈的的定义 栈(stack)是一种只能在一端进行插入或删除操作的线性表。特点是先进后出(把它想象成羽毛球筒,最先进去的羽毛球最后才能拿出来) 1.2栈的实现 1.2.1顺序栈 1.2.2链栈 1.3栈的应用 深度优先搜索 括号匹配 中辍表达式转后戳 2.队列 2.1队列的定义 队列(q
阅读全文
摘要:1.线性表的定义 线性表(linear list)是具有相同特性的数据元素的一个有序集合 2.线性表的基本操作 3.线性表的存储结构 3.1顺序储存结构——顺序表 顺序储存结构是把线性表中的元素按照其逻辑顺序依次存储到一块连续的存储空间中 3.1.1增加元素——(a3后面添加一个元素b) 3.2链式
阅读全文
摘要:在了解时间复杂度之前,先了解一下原操作和时间频度 一.原操作 原操作是指固有的数据类型的操作,可以理解为基本运算,下面的代码块中 3,6,7,9 都是原操作 c 例2 void foo (int n) { int i,j; for(i = 0;i 三.时间复杂度 O(n) 时间复杂度是用时间频度的最
阅读全文