数据结构/算法
文章平均质量分 92
一个技术渣渣
这个作者很懒,什么都没留下…
展开
-
Mysql的索引为什么使用B+树而不使用跳表?
在我们的印象中,mysql数据表里无非就是存储一行行的数据。跟个excel似的。直接遍历这一行行数据,性能就是O(n),比较慢。为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg(n))。但问题就来了,查询数据性能在 lg(n) 级别的数据结构有很多,比如redis的zset里用到的跳表,也是lg(n),并且实现还贼简单。那为什么mysql的索引,不使用跳表呢?我们今天就来聊聊这个话题。B+树的结构之前的一篇文章里,已经提到过B+树的结构了。文章不长,如果没看过,建议原创 2022-04-19 23:36:04 · 153 阅读 · 1 评论 -
java 集合的数据结构
1、Collection集合 2、Map集合 * 图片中略掉抽象类 1)Col转载 2015-02-13 15:43:39 · 655 阅读 · 0 评论 -
红黑树详解
一、红黑树(Red-Black Tree)是二叉搜索树(Binary Search Tree)的一种。二叉搜索树在最坏的情况下可能会变成一个链表(当所有节点按从小到大的顺序依次插入后)。这种低效产生的原因是树没有维持一定的平衡性,要提高搜索效率,就要想办法来维持树左边的平衡,也就是要尽时降低树的高度,可行的做法就是用一些策略在每次修改树的内容之后都调整树的结构,使之满足一定的平衡条件。其中一种满足转载 2014-03-27 17:27:52 · 927 阅读 · 0 评论 -
视觉直观感受7种常用的排序算法
1 快速排序介绍: 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二转载 2014-03-20 10:45:42 · 657 阅读 · 0 评论 -
排序算法的时间复杂度和空间复杂度
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。直接插入排序:O(n*n)选择排序:O(n*n)快速排序:平均时间复杂度log2(n)*n,转载 2014-03-04 20:17:35 · 970 阅读 · 0 评论 -
图的拓扑排序
介绍假设我们有一组任务要完成,并且有些任务要在其它任务完成之后才能开始,所以我们必须非常小心这些任务的执行顺序。如果这些任务的执行顺序足够简单的话,我们可以用链表来存储它们,这是一个很好的方案,让我们可以准确知道任务的执行顺序。问题是有时候不同任务之间的关系是非常复杂的,有些任务依赖于两个甚至更多的任务,或者反过来很多任务依赖自己。因此我们不能通过链表或者树的数据结构来对这个问题建模。转载 2014-03-04 14:53:23 · 734 阅读 · 0 评论 -
贪心算法精讲
一.贪心算法的基本概念 当一个问题具有最优子结构性质时,我们会想到用动态规划法去解它。但有时会有更简单有效的算法。我们来看一个找硬币的例子。假设有四种硬币,它们的面值分别为二角五分、一角、五分和一分。现在要找给某顾客六角三分钱。这时,我们会不假思索地拿出2个二角五分的硬币,1个一角的硬币和3个一分的硬币交给顾客。这种找硬币方法与其他的找法相比,所拿出的硬币个数是最少的。这里,我们下意识转载 2014-03-04 18:56:15 · 760 阅读 · 0 评论 -
(Java实现)二叉查找树--查找、删除、插入
二叉查找树二叉查找树(Binary Search Tree),或者是一颗空树,或者是具有下列性质的二叉树: 1、若它的左子树不空,则其左子树上的所有结点的值均小于它根结点的值; 2、若它的右子树不空,则其右子树上的所有结点的值均大于它根结点的值; 3、它的左、右子树也分别为二叉查找树。转载 2014-02-28 09:35:28 · 1141 阅读 · 0 评论 -
四叉树与八叉树
前序四叉树或四元树也被称为Q树(Q-Tree)。四叉树广泛应用于图像处理、空间数据索引、2D中的快速碰撞检测、存储稀疏数据等,而八叉树(Octree)主要应用于3D图形处理。对游戏编程,这会很有用。本文着重于对四叉树与八叉树的原理与结构的介绍,帮助您在脑海中建立四叉树与八叉树的基本思想。本文并不对这两种数据结构同时进行详解,而只对四叉树进行详解,因为八叉树的建立可由四叉树的建立推得。若有不足之转载 2014-03-04 18:53:35 · 910 阅读 · 0 评论 -
程序员必知的8大排序(java实现)(四)(基数排序)
8、基数排序 (1)基本思想: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。 (2)实例: (3)用java实现import java.util.ArrayList;import java.util.List;publ转载 2014-02-28 09:34:06 · 693 阅读 · 0 评论 -
程序员必知的8大排序(java实现)(二)(堆排序)
4、堆排序 (1)基本思想: 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi (2)实例: 初始序列:46,79,56,38,40,84 建堆: 交换,从堆中踢出最大数转载 2014-02-28 09:31:50 · 651 阅读 · 0 评论 -
Java中使用二分法排序
具体代码:import java.util.Scanner;//二分法public class SplitBy2Sort { public static int splitBy2(int[] a, int num) { int low = 0; int high = a.length - 1; int mid; while (true) { // 取中间下标原创 2014-02-28 09:36:26 · 2442 阅读 · 0 评论 -
程序员必知的8大排序(java实现)(三)(冒泡+快速+归并)
5、冒泡排序 (1)基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 (2)实例: (3)用java实现public class bubbleSort { public bubbleS转载 2014-02-28 09:33:04 · 706 阅读 · 0 评论 -
整理:数据结构面试大全
1.判断链表是否存在环型链表问题:判断一个链表是否存在环,例如下面这个链表就存在一个环:例如N1->N2->N3->N4->N5->N2就是一个有环的链表,环的开始结点是N5这里有一个比较简单的解法。设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。直到p2碰到NULL指针或者两个指针相等结束循环。如果两个指针相等则说明存在环。struct link {转载 2014-02-28 09:37:15 · 850 阅读 · 0 评论 -
哈夫曼树
1. 哈夫曼树的基本概念 哈夫曼树( Huffman )又称最优二叉树,是一类带权路径长度最短的树,有着广泛的应用。 在讨论哈夫曼树之前首先需要弄清楚关于路径和路径长度的概念。树中两个结点之间的路径由一个结点到另一结点的分支构成。两结点之间的路径长度是路径上分支的数目。树的路径长度是从根结点到每一个结点的路径长度之和。 设一棵二叉树有 n 个叶子结点,每个叶子结点拥有一个权值W转载 2014-02-28 09:38:31 · 1030 阅读 · 0 评论 -
程序员必知的8大排序(java实现)(一)(插入+希尔+简单选择)
8种排序之间的关系:1、 直接插入排序(1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例(3)用java实现public class insertSort { public inser转载 2014-02-28 09:30:14 · 696 阅读 · 0 评论 -
中缀表达式转换为前缀及后缀表达式并求值【摘】
它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。举例:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式中缀表达式(中缀记法)中缀表达式是一种通用的算术或逻辑公式表示方法转载 2014-02-28 09:28:21 · 1455 阅读 · 1 评论