算法数据结构
文章平均质量分 83
heyuchang666
这个作者很懒,什么都没留下…
展开
-
数据结构—队列
队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入的一端称为队尾(rear),允许删除元素的一端称为队头(front)。原创 2015-10-23 21:58:45 · 6376 阅读 · 0 评论 -
地精排序Gnome Sort
地精算法总是发现第一个 【两个相邻元素存在错误的顺序】,然后把他们交换。原理是,交换一对乱序元素后,会产生一对新的无序相邻元素,而这两个元素要么交换前有序,要么交换后有序。它不认为元素当前的位置是有序的,所以它只需要在交换元素前直接检查位置。原创 2016-01-21 11:37:53 · 534 阅读 · 0 评论 -
奇偶排序Odd-even sort
奇偶排序Odd-even sort参看 维基百科的定义又一个比较性质的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序原创 2016-01-21 11:52:35 · 2789 阅读 · 0 评论 -
梳排序(Comb sort)
梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte杂志中推广。梳排序是改良自泡沫排序和快速排序,其要旨在于消除乌龟,亦即在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地,兔子,亦即在阵列前端的大数值,不影响泡沫排序的效能。 在泡沫排序中,只比较阵列中相邻的二项,即比较的二项的间距(Gap)是1,梳排序提出此间距其实可大于1,改自插入排序的希尔排序同原创 2016-01-21 12:09:48 · 1818 阅读 · 0 评论 -
耐心排序Patience Sorting
这个排序的关键在建桶和入桶规则上建桶规则:如果没有桶,新建一个桶;如果不符合入桶规则那么新建一个桶入桶规则:只要比桶里最上边的数字小即可入桶,如果有多个桶可入,那么按照从左到右的顺序入桶即可原创 2016-01-21 12:26:45 · 792 阅读 · 0 评论 -
珠排序Bead Sort
珠排序是一种自然排序算法,由Joshua J. Arulanandham, Cristian S. Calude 和 Michael J. Dinneen 在2002年发展而来,并且在欧洲理论计算机协会(European Association for Theoretical Computer Science,简称EATCS)的新闻简报上发表了该算法。无论是电子还是实物上的实现,珠排序都能在O(n)时间内完成;然而,该算法在电子上的实现明显比实物要慢很多,并且只能用于对正整数序列进行排序。并且,即使在最好的原创 2016-01-21 12:40:44 · 2005 阅读 · 0 评论 -
计数排序Counting sort
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。算法思想计数排序对输入的数据有附加的限制条件:1、输入的线性表的元素属于有限偏序集S;2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。原创 2016-01-21 12:54:03 · 725 阅读 · 0 评论 -
两个栈实现队列 两个队列实现栈
s1是入栈的,s2是出栈的。入队列,直接压到s1是就行了出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中实现二思路 s1是入栈的,s2是出栈的。保证所有元素都在一个栈里面入队列时:如果s1为空,把s2中所有的元素倒出压到s1中;否则直接压入s1出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素比较:与实现一相比较,出队列时不必每次都捣鼓了。实现三思路原创 2015-12-07 11:29:35 · 986 阅读 · 1 评论 -
二叉树总结创建,遍历
二叉树作为树的一种,是一种重要的数据结构,二叉树中的面试题比较常见的题型大概有下面几个:创建一颗二叉树(先序,中序,后序)、遍历一颗二叉树(先序,中序,后序和层次遍历)、求二叉树中叶子节点的个数、求二叉树的高度、求二叉树中两个节点的最近公共祖先、打印和为某一值的全部路径、求某一节点是否在一个树中等等。原创 2015-10-23 17:54:51 · 11815 阅读 · 0 评论 -
八大排序算法(一)
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;原创 2015-08-04 13:36:57 · 7179 阅读 · 2 评论 -
桶排序Bucket sort
桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n)下限的影响。原创 2016-01-21 11:13:31 · 992 阅读 · 0 评论 -
用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案,M<=5,N<2^31,输出答案mod p的结果
我们以M=3为例进行讲解。假设我们把这个矩形横着放在电脑屏幕上,从右往左一列一列地进行填充。其中前n-2列已经填满了,第n-1列参差不齐。现在我们要做的事情是把第n-1列也填满,将状态转移到第n列上去。由于第n-1列的状态不一样(有8种不同的状态),因此我们需要分情况进行讨论。转载 2017-03-29 18:40:47 · 8171 阅读 · 2 评论 -
鸽巢排序Pigeonhole sort
鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用。当涉及到多个不相等的元素, 且将这些元素放在同一个"鸽巢"的时候, 算法的效率会有所降低.为了简便和保持鸽巢排序在适应不同的情况, 比如两个在同一个存储桶中结束的元素必然相等。 我们一般很少使用鸽巢排序, 因为它很少可以在灵活性, 简便性, 尤是速度上超过其他排序算法. 事实上, 桶排序较鸽巢排原创 2016-01-21 11:00:35 · 1244 阅读 · 0 评论 -
叶子结点
叶子结点 叶子结点是离散数学当中的概念。一棵树当中没有子结点(即度为0)的结点,称为叶子结点,简称“叶子”。 叶子是指度为0的结点,又称为终端结点。原创 2016-01-17 15:18:05 · 18939 阅读 · 1 评论 -
排序算法稳定性
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)原创 2016-01-17 15:11:02 · 562 阅读 · 0 评论 -
八大排序算法(二)
交换排序1)选择一个基准元素,通常选择第一个元素或者最后一个元素,2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。3)此时基准元素在其排好序后的正确位置4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。快速排序的示例:(a)一趟排序的过程:原创 2015-08-04 13:44:48 · 2121 阅读 · 0 评论 -
【字典树】串集合查找
Trie 树,又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。Trie 有三种结构: 标准trie (standard trie)、压缩trie、后缀trie(suffix trie) 。 最后一种将在《字符串处理4:后缀树》中详细讲,这里只将前两种。1. 标准Trie (standard trie)标准 Trie树的结构 : 所有含有公共前缀的字符串将挂在树中同一个结点下。实际上trie原创 2015-11-11 17:20:16 · 987 阅读 · 0 评论 -
【后缀树】子串匹配结构
Suffix Trie: 又称后缀Trie或后缀树。它与Trie树的最大不同在于,后缀Trie的字符串集合是由指定字符串的后缀子串构成的。比如、完整字符串"minimize"的后缀子串组成的集合S。可见Suffic Trie是一种很适合操作字符串子串的数据结构。原创 2015-11-11 17:30:18 · 1454 阅读 · 0 评论 -
数据结构—栈
(一)栈的定义及基本运算(1)栈的定义 栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为先进后出(FILO)的线性表。在栈中进行插入和删除操作的一端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含数据元素的栈称为空栈。(2)栈的基本算法初始化栈InitStack(S):创建原创 2015-10-30 19:36:18 · 14352 阅读 · 2 评论 -
数据结构(全)
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据原创 2015-11-23 17:13:28 · 104452 阅读 · 18 评论 -
数据结构—散列表(Hash table,也叫哈希表)
散列表(Hash table,也叫哈希表)是一种查找算法,与链表、树等算法不同的是,散列表算法在查找时不需要进行一系列和关键字(关键字是数据元素中某个数据项的值,用以标识一个数据元素)的比较操作。 散列表算法希望能尽量做到不经过任何比较,通过一次存取就能得到所查找的数据元素,因而必须要在数据元素的存储位置和它的关键字(可用key表示)之间建立一个确定的对应关系,使每个关键字和散列表中一个唯一的存储位置相对应。因此在查找时,只要根据这个对应关系找到给定关键字在散列表中的位置即可。这种对应关系被称为散列原创 2015-11-23 16:12:40 · 8733 阅读 · 1 评论 -
数据结构—图
图(Graph)是一种比线性表和树更为复杂的数据结构。线性结构:是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何一个元素都有唯一的一个直接前驱和直接后继。 树结构:是研究数据元素之间的一对多的关系。在这种结构中,每个元素对下(层)可以有0个或多个元素相联系,对上(层)只有唯一的一个元素相关,数据元素之间有明显的层次关系图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。原创 2015-11-18 19:11:48 · 5440 阅读 · 0 评论 -
八大排序算法图文动态 讲解
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。本文将依次介绍上述八大排序算法。动态图形象介绍。原创 2015-11-25 20:27:00 · 8963 阅读 · 0 评论 -
复杂链表的复制(二)
有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。如果没有random pointer那是极容易的,顺着链表走读一遍 ,逐个拷贝节点并链接即可,有了random pointer后,其实也就是加上了记录random pointer的关系而已,考虑到random pointer可以往前指,也可以往后指,则必须全部遍历完才能完整地建立起random pointer对应关系表,记录对应关系,当然用map的数据结构啦,c++不太熟,查了下原创 2015-12-14 23:11:43 · 429 阅读 · 0 评论 -
复杂链表的复制
Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的解答此题。看图便知。原创 2015-12-14 23:06:55 · 581 阅读 · 0 评论 -
鸡尾酒排序
鸡尾酒排序 鸡尾酒排序也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此演算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。原创 2016-01-17 00:56:58 · 807 阅读 · 0 评论 -
虚数的意义
这就是虚数乘法的物理意义:改变旋转角度。将实数轴看作横轴,虚数轴看作纵轴,就构成了一个二维平面。旋转到某一个角度的任何正实数,必然唯一对应这个平面中的某个点。只要确定横坐标和纵坐标,比如( 1 , i ),就可以确定某个实数的旋转量(45度)。数学家用一种特殊的表示方法,表示这个二维坐标:用 + 号把横坐标和纵坐标连接起来。比如,把 ( 1 , i ) 表示成 1 + i 。这种表示方法就叫做复数(complex number),其中 1 称为实数部,i 称为虚数部。转载 2017-07-21 19:14:15 · 1299 阅读 · 0 评论