
数据结构&算法
文章平均质量分 74
数据结构/算法
LceChan
这个作者很懒,什么都没留下…
展开
-
汇编代码查看工具
分析内存布局的神器。原创 2022-10-01 19:53:08 · 1205 阅读 · 0 评论 -
汇编语言之寄存器(详细介绍)
32位CPU有2个32位通用寄存器ESI和EDI,其低16位对应先前CPU中的SI和DI,对低16位数据的。在实方式下,由于每个段的最大范围为64KB,所以,EIP的高16位肯定都为0,此时,相当于只用其低16。一共6个,包括:CF进位标志位、PF奇偶标志位、AF辅助进位标志位、ZF零标志位、偏移地址的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、一个可乘以1、2、4、8的32位变址寄存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。转载 2022-10-01 17:40:27 · 8180 阅读 · 0 评论 -
ProtcolBuffer基础原理
Protocol Buffer由Google出品的一款轻量而高效的数据序列化和反序列化的方法,下面的我们来介绍一下Protocol Buffer的内部实现原理。原创 2022-10-01 12:29:12 · 647 阅读 · 0 评论 -
单链表反转详解(4种算法实现)
本节仅以无头节点的链表为例,讲解了实现链表反转的 4 种方法。使用迭代反转法实现时,初始状态忽略头节点(直接将 mid 指向首元节点),仅需在最后一步将头节点的 next 改为和 mid 同向即可;使用头插法或者就地逆置法实现时,仅需将要插入的节点插入到头节点和首元节点之间即可;递归法并不适用反转有头结点的链表(但并非不能实现),该方法更适用于反转无头结点的链表。原创 2022-08-20 12:50:04 · 791 阅读 · 0 评论 -
连续子数组的最大和(二)
但是题目要求需要返回长度最长的一个,我们则每次用 left、right 记录该子数组的起始,需要更新最大值的时候(要么子数组和更大,要么子数组和相等的情况下区间要更长)顺便更新最终的区间首尾,最后根据区间首尾获取子数组。可以用dp数组表示以下标i为终点的最大连续子数组和,则每次遇到一个新的数组元素,连续的子数组要么加上变得更大,要么它本身就更大,因此状态转移为。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组。返回的数组不计入空间复杂度计算。原创 2022-09-09 21:40:07 · 239 阅读 · 0 评论 -
堆排序算法(图解详细流程)
首先将无需数组构造成一个大根堆(新插入的数据与其父结点比较)固定一个最大值,将剩余的数重新构造成一个大根堆,重复这样的过程。转载 2022-08-21 13:08:02 · 464 阅读 · 0 评论 -
经典排序算法总结
希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。首先将待排序的n个数据构造为大根堆,将顶端数据与末尾数据进行交换并将堆的尺寸减一,然后剩余n-1个数据再次构造为大根堆,再次交换,再次缩减,直至所有数据有序。数据是正序时,耗费时间最短O(n)。将前i个(初始为1)数据假定为有序序列,依次遍历数据,将当前数据插入到前述有序序列的适当位置,形成前i+1个有序序列,依次遍历完所有数据,直至序列中所有数据有序。原创 2022-08-20 16:24:50 · 289 阅读 · 0 评论 -
二进制角度理解快速幂
二进制角度理解快速幂原创 2022-08-14 00:07:34 · 132 阅读 · 0 评论 -
异或理解与应用
异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。性质1、交换律2、结合律(即(a^b)^c == a^(b^c))3、对于任何数x,都有x^x=0,x^0=x4、自反性 A XOR B XOR B = A xor 0 = A异或运算最常见于多项式除法.转载 2021-10-01 22:58:13 · 1591 阅读 · 0 评论 -
各种排序算法比较:时间复杂度,空间复杂度
各种排序算法比较:时间复杂度,空间复杂度时间复杂度n^2表示n的平方,选择排序有时叫做直接选择排序或简单选择排序排序方法平均时间最好时间最坏时间桶排序(不稳定)O(n)O(n)O(n)基数排序(稳定)O(n)O(n)O(n)归并排序(稳定)O(nlogn)O(nlogn)转载 2013-09-03 22:52:39 · 1245 阅读 · 0 评论 -
链表的相交与环问题
1、 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。 示意图如下:如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则不转载 2013-09-12 23:44:05 · 743 阅读 · 0 评论 -
求数组中给定下标区间内的第K小(大)元素
转自http://blog.youkuaiyun.com/v_JULY_v 。第一节、寻找给定区间内的第k小(大)的元素 给定数组,给定区间,求第K小的数如何处理?求最小的k个元素用最大堆,求最大的k的元素用最小堆。OK,常规方法请查阅:程序员编程艺术:第三章、寻找最小的k个数。 1、排序,快速排序。我们知道,快速排序平均所费时间为n*logn,从小到大排序这n个数,然转载 2013-09-11 22:28:37 · 1513 阅读 · 0 评论 -
后缀数组求最长重复子串
转自:http://blog.youkuaiyun.com/hackbuteer1/article/details/7968623问题描述给定一个字符串,求出其最长重复子串例如:abcdabcd最长重复子串是 abcd,最长重复子串可以重叠例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的。直观的解法是,首先检测长度为 n - 1 的字符串情况,如果不原创 2013-09-15 21:26:09 · 816 阅读 · 0 评论 -
深入理解按位异或运算符
参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。即: 0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0按位异或的3个特点:(1) 0^0=0,0^1=1 0异或任何数=任何数(2) 1^0=1,1^1=0 1异或任何数-任何数取反(3) 任何数异或自己=把自己置0按位异或的几个转载 2014-03-12 23:13:09 · 652 阅读 · 0 评论 -
strstr函数的自己实现
请用标准C语言实现下列标准库函数,设计中不得使用其他库函数。char *strstr(char *str1,char *str2);在字符串str1中,寻找字串str2,若找到返回找到的位置,否则返回NULL。[cpp] view plaincopy#include #include using namespace s原创 2014-03-12 23:10:25 · 801 阅读 · 0 评论 -
B树、B-树、B+树、B*树 红黑树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关转载 2014-03-17 23:48:44 · 771 阅读 · 0 评论 -
单链表查找倒数第k个节点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历这个链表,我们还是把思路回到头结点上来。假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1...原创 2014-03-18 23:24:24 · 1921 阅读 · 0 评论 -
轻松搞定面试中的二叉树题目
轻松搞定面试中的二叉树题目树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一转载 2013-09-03 22:52:59 · 743 阅读 · 0 评论 -
经典面试题:链表的相交与环问题
转自:http://blog.youkuaiyun.com/walkinginthewind/article/details/70740221. 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。示意图如下:如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后原创 2013-09-08 23:37:46 · 801 阅读 · 0 评论 -
STL Sort排序的实现
STL的sort算法,在数据量大时采用 Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负担,改用Insertion Sort。如果递归层次过深,还会采用Heap Sort。 Quick Sort的特点是为pivot找位置,一轮后pivot的位置便是其最终的位置。Insertion Sort 算法实现 /原创 2013-03-09 01:23:18 · 964 阅读 · 0 评论 -
算法之查找第k大的元素
为达到目的,若全排所有数据,显然做了很多无用功,所有的排序算法思想,主要有两种思路:1. 为元素找位置(例如快排) 2.为位置找元素(例如选择排序)若k比较小,而整个数组元素非常多,显然首选选择排序;若k不处于靠端,则可利用分治的思想, 快排实现过程中第一步,为基准元素找到位置,得到基准元素在整个数组的位置,根据其位置,确定第k个元素在基准元素的哪一端。原创 2013-03-09 23:14:48 · 1284 阅读 · 0 评论 -
快速排序算法实现
#include //Printf the element of the arrayvoid PrintfArray(int *Array, int front, int rear){ for(int i = front; i <= rear; i++) { printf("%d\t", *(Array+i));原创 2013-03-09 17:48:48 · 1379 阅读 · 1 评论 -
一些重要的算法
下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的或是比较生僻的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节转载 2013-06-16 19:01:24 · 763 阅读 · 0 评论 -
KMP算法深度解析
摘要:KMP算法是字符串匹配的经典算法,由于其O(m+n)的时间复杂度,至今仍被广泛应用。大道至简,KMP算法非常简洁,然而,其内部却蕴含着玄妙的理论,以至许多人知其然而不知其所以然。本文旨在解开KMP算法的内部玄妙所在,希望能够有助于学习与理解。 1、KMP算法 一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此称之为转载 2013-07-22 23:12:21 · 657 阅读 · 0 评论 -
KMP算法之总结篇
六之再续:KMP算法之总结篇(必懂KMP)作者:July。出处:http://blog.youkuaiyun.com/v_JULY_v/。引记 此前一天,一位MS的朋友邀我一起去与他讨论快速排序,红黑树,字典树,B树、后缀树,包括KMP算法,唯独在讲解KMP算法的时候,言语磕磕碰碰,我想,原因有二:1、博客内的东西不常回顾,忘了不少;2、便是我对K转载 2013-07-22 23:16:30 · 734 阅读 · 0 评论 -
判断两个链表是否交叉,并求出交叉点
给定两个链表,如何来判断这两个链表相交了首先应该分两种情况考虑,第一:这两个链表本身都没有环。 第二:这两个链表本身都有环 首先讲都没有环的情况,如下图方法很多,不过我想最简单的方法是遍历第一个链表,然后遍历到最后一个节点时候,用一个指针把节点地址记录下来然后再来遍历第二个链表,同样记录下最后一个链表的地址,如果两个指针的指向一样,那么就可以判断出转载 2013-08-01 22:05:19 · 3129 阅读 · 0 评论 -
快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
一、快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解: 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记原创 2013-08-20 22:19:23 · 727 阅读 · 0 评论 -
随机生成100万个数,排序后保存在文件中
转自:http://blog.youkuaiyun.com/hackbuteer1/article/details/6574908随机生成100万个数,存储在文件out1.txt中,使用内部排序完成,并重新储存在文件out2.txt中。(一)使用STL中的qsort函数进行操作:[cpp] view plaincopy#include原创 2013-08-20 22:22:25 · 1879 阅读 · 0 评论 -
字符串匹配算法总结(转)
KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦!老子就是今天图书馆在写了几个小时才勉强写了一个有bug的、效率不高的KMP,特别是计算next数组的部分。其实,比KMP算法速度快的算法大把大把,而且理解起来更简单,为何非要抓住KMP呢?笔试出现字符串模式匹配时直接上sunday算法,既简单又高效,何乐而不为?说实话,想到sunday算法的那个人,绝对是发散思原创 2013-08-22 23:24:50 · 898 阅读 · 0 评论 -
Horspool字符串匹配算法
Horspool是后缀搜索,也就是搜索已读入文本中是否含有模式串的后缀;如果有,是多长,显然,当后缀长度等于模式串的长度时,我们就找到了一个匹配。Horspool算法认为:对于每个文本搜索窗口,将窗口内的最后一个字符(C)与模式串的最后一个字符进行比较。如果相等,则继续从后向前验证其他字符,直到完全相等或者某个字符不匹配。然后,无论匹配与否,都将根据在模式串的下一个出现位置将窗口向右移动。原创 2013-08-22 23:26:28 · 1031 阅读 · 0 评论 -
Boyer-Moore算法学习
转自:http://blog.youkuaiyun.com/sealyao/article/details/45681671、概述在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前相当有效又容易理解的一种,一般情况下,比KMP算法快3-5倍。BM算法在移动模式串的时候是从左到右,而进行比较的时候是从右到左的。常规的匹配算法移动模式串的时候是从左到右,原创 2013-08-23 22:00:28 · 713 阅读 · 0 评论 -
Sunday算法
假设我们有如下字符串:A = "LESSONS TEARNED IN SOFTWARE TE";B = "SOFTWARE";Sunday算法的大致原理是:先从左到右逐个字符比较,以我们的字符串为例:开始的时候,我们让i = 0, 指向A的第一个字符; j = 0 指向B的第一个字符,分别为"L"和"S",不等;这个时候,Sunday算法要求,找到位于A字串原创 2013-08-23 22:11:33 · 744 阅读 · 0 评论 -
RK算法分析
这一节介绍一下由Rabin和Karp提出的RK算法。1,RK算法的基本思想 HASH! 如果两个字符串hash后的值不相同,则它们肯定不相同;如果它们hash后的值相同,它们不一定相同。 RK算法的基本思想就是:将模式串P的hash值跟主串S中的每一个长度为|P|的子串的hash值比较。如果不同,则它们肯定不相等;如果相同,则再诸位比较之。原创 2013-08-23 22:16:25 · 6561 阅读 · 3 评论 -
轻松搞定面试中的二叉树题目
转自:http://blog.youkuaiyun.com/walkinginthewind/article/details/7518888树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决原创 2013-09-08 23:20:14 · 600 阅读 · 0 评论 -
轻松搞定面试中的链表题目
转自:http://blog.youkuaiyun.com/luckyxiaoqiang/article/details/7393134链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力。链表的操作也离不开指针,指针又很容易导致出错。综合多方面的原因,链表题目在面试中占据着很重要的地位。本文对链表相关的面试题做了较为全面的整原创 2013-09-08 23:23:38 · 692 阅读 · 0 评论 -
找出一个数组里面前K个最大数
注: 算法分析全来自互联网第一种方法: 快排 时间复杂度 nlogn进行了全排,做了冗余的事情,可优化第二种方法: 构造一临时数组,其中含k个元素, 在剩余的n-k个数中,在临时数组中找到其位置,挤出最小的数 时间复杂度 (n-k)+ k*logk原创 2013-03-07 22:47:47 · 2690 阅读 · 0 评论