数据结构与算法
走出去拍拍照
这个作者很懒,什么都没留下…
展开
-
数据结构:二叉查找树(BST)&平衡二叉树(AVL)
本系列博客整理自网络,其中加入部分个人见解,如果你在看到这个系列的博客的时候有似曾相识的感觉,非常正常,主要是用于本人以后学习与复习,参考的原博客的地址我也会在博客前面或后面给出。二叉查找树(BST)二叉查找树定义:二叉查找树(Binary Search Tree),又被称为二叉搜索树。设x为二叉查找树中的一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子...原创 2017-10-11 21:55:51 · 656 阅读 · 0 评论 -
快速幂取余算法(C语言)
首先,我们得知道一个公式(a^b) mod c=((a mod c)^b) mod c现在,我们不考虑任何其他情况,也不考虑程序的健壮性,我们算一个幂次a^b算法一int result = 1;for(int i = 0; i < b; i++){ result *= a;}return result;这个算法的时间复杂度为O(n),显然,我们必须找到一个复杂度低...原创 2018-10-29 23:11:49 · 4316 阅读 · 1 评论 -
剑指offer:矩阵中的路径(C语言)
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3*4的矩阵中包含一条字符串”bfce”的路径(路径中的字母用红色标出)。但矩阵中不包含字符串”abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格...原创 2018-10-29 23:14:11 · 532 阅读 · 1 评论 -
剑指offer:机器人的运动范围(C语言)
题目:地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左右上下移动一格,但不能进入行坐标和列坐标之和大于K的格子。例如,当k为18的时,机器人能够进入的方格(35,37),因为3+5+3+7=18.但是它不能进入方格(35,38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?分析:本质上是和前面矩阵中的路径一样的问题,都是利用回溯法来实现。...原创 2018-10-29 23:16:08 · 486 阅读 · 0 评论 -
剑指offer:二维数组中的查找(C语言)
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一行都按从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判读数组中是否含有该整数。分析:首先想到的是遍历整个数组,这样肯定能找出来,但是那样的时间复杂度就是O(n)了。按照常规来说,这个是不可取的。既然这是一个有规律的数组,那么我们可以找到一个突破口,如果我们找这个数组的左上角或者右下角的值,这两个值都是最小...原创 2018-10-29 23:17:55 · 831 阅读 · 0 评论 -
剑指offer:二叉树的下一个节点(C语言)
题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。分析如下:1、如果该节点是普通节点(该情况适用于根节点),如果它的右孩子存在,则需要找它的有孩子的左子节点,直到找到叶子节点,这个叶子节点就是下一个节点了;由于是中序遍历,左孩子的情况不用考虑了。2、如果该节点是父节点的左孩子,则下一个节点就是其父节...原创 2018-10-29 23:19:38 · 279 阅读 · 0 评论 -
剑指offer:打印1到最大的n位数(C语言)
题目:输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3,打印1到999。分析:这个题目需要考虑两个问题,一个是这个数字可能会小于等于0;另一个是这个数字可能非常大,我们应该如何保存这个数字?这里说到表示大数,可以用到的方法有字符串和数组! #include<stdio.h>#include<string.h>int Increment(char ...原创 2018-10-29 23:21:19 · 363 阅读 · 0 评论 -
剑指offer:重建二叉树(C语言)
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。二叉树节点的定义如下:#include<stdio.h>#include<stdlib.h>//二叉树结构的定义typedef struct BinaryTreeNode{ int m_nValue; struct BinaryTreeNo...原创 2018-10-29 23:33:16 · 1826 阅读 · 0 评论 -
数据结构之图
1.图的定义图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常称为顶点(vertex),而点到点之间的连线通常称之为边或者弧(edge)。通常记为G=(V,E)。 2.图的分类图通常分为有向图和无向图,而其表示表示方式分为邻接矩阵和邻接链表。具体表示如下图。对于无向图,其所有的边都不区分方向。G=(V,E)。其中,<1&...原创 2018-11-13 21:33:16 · 3213 阅读 · 3 评论 -
剑指offer:旋转数组的最小数字(C语言)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如{1,2,3,4,5}是{3,4,5,1,2}的一个旋转,该数组的最小值为1。 分析:如果是在一个数组中找最小或者最大值,最简单的方法就是遍历查找,怎么都能找到,时间复杂度就是O(n)。肯定还有更加简单的方法,对于这个已经排序的数组,它其实是由两个排序的数组...原创 2018-11-13 21:40:27 · 536 阅读 · 0 评论 -
动态规划:从入门到放弃
Dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems,solving each of those subproblems just once,and storing their solutions.斐波拉...原创 2018-11-13 22:17:48 · 23480 阅读 · 13 评论 -
几种常见GC算法介绍
本文主要是对常用的GC算法(引用计数法、标记-清除法、复制算法、标记-清除算法)作出相关的说明,并对相关知识做简单的介绍。一、什么是堆? 堆指用于动态(即执行程序时)存放对象的内存空间。而这个对象,在面向对象的编程中,它指“具有属性和行为的事物”,然而在GC的世界中,对象表示的是“通过应用程序利用的数据的集合”。具体到Java堆,它是所有线程共享的一块内存区域,在虚拟机启动时创...原创 2019-02-21 23:49:16 · 38177 阅读 · 4 评论 -
JVM垃圾回收器介绍
一、分代回收算法 在我们的经验之中,大部分的对象在生成之后就会马上变成垃圾,很少有对象能够或很久。这个就是我们将对象分成新生代和老年代的依据。在不同的代采用不同的收集是算法,从而提高内存的利用率。 我们的分区一般如下图所示,一个生成空间,两个大小相等的幸存空间,一个老年代空间。而针对它们的回收,我们的叫法也不相同。 新生代GC(minor GC):...原创 2019-02-22 22:36:48 · 15426 阅读 · 1 评论 -
大数相关算法
在华为的机试的时候,碰到了大数的问题,所有的大数问题,无非就是相加相减相乘相除这四种,里面的区别就是大数的表示方式,一般我们采用字符数组的方式去保存大数,也有采用链表的。这两种方式中,字符数组的方式比较好理解一些,本文通过代码,来说明大数运算的集中情况,力争将这个问题讲清楚。大数相乘题目描述:输入两个不超过100位的大整数的乘积。输入:1234567 123输出:151851741...原创 2019-07-16 23:56:19 · 684 阅读 · 0 评论 -
约瑟夫环问题
什么是约瑟夫问题?所谓约瑟夫问题就是N个人围成一圈,从第一个人开始报数,报M的那个人出局;接着又是M+1那个人开始报数,从1开始报,后面报M的那个人出局;以此循环,直到最后只剩一个人,求这个人的初始下标或者初始排第几位?下图就是10个人,报3的出局的模型!很多的解答当中都提到了最笨的方式,利用链表来模拟,N个人看作是N个链表节点,节点1指向节点2,节点2指向节点3,……,节点N-1指向...原创 2019-07-22 11:59:41 · 575 阅读 · 0 评论 -
剑指offer:用特定字符替代字符串中的空格(C语言)
题目:请实现一个函数,把字符串中的每个空格替换成”%20”。分析:最简单的就是在弄来一个比已有字符串数组更大的数组,然后复制过,碰到空格就写入“%20”,这样就会浪费内存空间。还有就是从前往后推,碰到空格用”%20”来替代,后面的数组往后挪动,这样的时间复杂度是O(n2)。得找到一个时间复杂度和空间复杂度相对小的方法,书中提供的是从后往前挪动。代码如下:#include<std...原创 2018-10-29 23:08:12 · 294 阅读 · 0 评论 -
剑指offer:正则表达式匹配(C语言)
题目:请实现一个函数用来匹配包含’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包括0次)。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,与”aa.a”和”ab*a”均不匹配。分析:如果模式中是字符或者”.”时,都只会匹配一个字符,只是字符需要与之相互匹配,而”.”可以和任何一个字符匹配;而对于”*”,就需要分情况来考虑...原创 2018-10-29 23:05:01 · 311 阅读 · 0 评论 -
剑指offer:查找最大子数组(C语言)
题目:一个整数数组中的元素有正有负,在该数组中找出一个连续的数组,要求连续的数组的和是最大的,我们成这个子数组就是最大的连续子数组。分析:对于这个找最大子数组的数组,如果这个数组里面全部是正数,那就不用考虑了,所有元素相加就是最大的子数组了;如果全部为负,则就是找里面的最大的元素;如果有正有负,则情况会麻烦一下。下面提供四种解法。解法一:int FindSubSum1(int *ar...原创 2018-10-29 23:02:32 · 539 阅读 · 0 评论 -
数据结构:红黑树
本系列博客整理自网络,其中加入部分个人见解,如果你在看到这个系列的博客的时候有似曾相识的感觉,非常正常,主要是用于本人以后学习与复习,参考的原博客的地址我也会在博客前面或后面给出。红黑树的定义:红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和...原创 2017-10-11 22:39:50 · 249 阅读 · 0 评论 -
算法:巴什(Bash)博弈与斐波那契博弈
在校招的时候经常遇到这个问题,今天被人提起,在这里总结一下。http://blog.csdn.net/xuzengqiang/article/details/7763635巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜。显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品...原创 2017-10-17 14:24:30 · 422 阅读 · 0 评论 -
数据结构:B树&B+树&B*树
本系列博客整理自网络,其中加入部分个人见解,如果你在看到这个系列的博客的时候有似曾相识的感觉,非常正常,主要是用于本人以后学习与复习,参考的原博客的地址我也会在博客前面或后面给出。一、B树 B 树又叫平衡多路查找树。一棵m阶的B 树的特性如下:(1)树中的每个节点最多拥有m个子节点且m>=2,空树除外(注:m阶代表一个树节点最多有多少个查找路径,m阶=m路,当 m=...原创 2017-10-11 23:26:18 · 787 阅读 · 0 评论 -
算法之旋转字符串
https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.01.md题目描述给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此转载 2017-10-31 15:15:56 · 222 阅读 · 0 评论 -
数据结构:树的基础知识
本系列博客整理自网络,其中加入部分个人见解,如果你在看到这个系列的博客的时候有似曾相识的感觉,非常正常,主要是用于本人以后学习与复习,参考的原博客的地址我也会在博客前面或后面给出。 数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树、B树、B+树、B*树等等下面从最基础的概念开始,介绍结构与实现。1、什么是树?树是一种数据结构,可以用来表示...原创 2017-10-11 13:34:38 · 750 阅读 · 0 评论 -
排序算法二(冒泡)(C+Python)
冒泡排序时间复杂度O(n2),空间复杂度O(1),该排序算法稳定!int swap(int a[],int i,int j){ //交换两元素的位置 int temp = a[i]; a[i] = a[j]; a[j] = temp;}void bubbleSort(int a[],int n){ for(int m = 0;m < n-1;m++){ //每...原创 2017-11-21 15:34:01 · 188 阅读 · 0 评论 -
排序算法(一)(插入)(C+python)
关于算法的稳定性排序算法稳定性的简单形式化定义为:如果a[i] = a[j],排序前a[i]在a[j]之前,排序后a[i]还在a[j]之前,则称这种排序算法是稳定的。通俗地讲就是保证排序前后两个相等的数的相对顺序不变。插入排序所需的时间取决于元素的初始时间,当一个数组本身就是序的时候,它的时间复杂度仅为O(n)。所以插入排序对部分有序的数足十分高效,也很适合小规模数组。直接插入排序时...原创 2017-11-20 20:06:51 · 238 阅读 · 0 评论 -
排序算法(三)(选择)(C+python)
选择排序首先就是找到数组中最小的那个元素,然后将其与数组中的第一个元素交换位置;接着在剩余的元素中找到最小的元素,将其与第二个元素交换位置。如此往复,直到将针整个数组排序。其实就是不断的在剩余数组中找最小的元素。所以它的运行时间和输入无关,它的移动也是最少的。选择排序时间复杂度O(n^2),空间复杂度O(1),不稳定!选择和冒泡的区别:选择是每次遍历未排序的数组,选出最小或最大的值,将...原创 2017-11-22 09:35:03 · 228 阅读 · 0 评论 -
数据结构之链表
什么是链表?链表是一种线性表,是一种在物理存储单元上非连续非顺序的存储结构。链表由一系列的节点构成,节点在运行时动态生成,每个节点包括数据域、指针域。链表的优点:1、链表是一个动态的数据结构,能够根据需要变化大小;2、插入和删除的操作非常的方便,耗时少;3、动态数据结构比如栈或队列可以用链表来实现;4、元素可以从中间添加或者移除。链表的缺点:1、因为指针的存在,相对...原创 2018-01-02 23:28:47 · 298 阅读 · 0 评论 -
数据结构之栈
什么是栈(stack)?栈又称堆栈,是一种先进后出(LIFO)的储存数据的线性表。它最主要的操作有三个,pop\push\top,pop是移除最上层的一个元素,push时将一个新的值压入到栈的顶部,top是返回顶部元素的值。栈的实现方式:静态数组、动态数组、链式静态数组实现代码:#define STACKTYPE int#define STACKSIZE 100#i...原创 2018-01-04 20:18:50 · 187 阅读 · 0 评论 -
数据结构之队列
什么是队列?队列(queue)是一种先进先出(FIFO)的数据结构。就如生活中排队一样,先排的人在队伍的最前面,后排的人在队伍的最后面。队列的实现方式队列的实现方式分为数组和链表两种数组的方式实现队列需要两个指针,指向对头的front,指向队尾的rear。由于队列是对的头部删除,队的尾部插入数据,当我们在删除数据之后,数据并不会自动去补齐前面已经删除的空白的位置,这就导致...原创 2017-12-29 23:14:16 · 276 阅读 · 0 评论 -
HashTable详解
1、什么是哈希表?哈希表(HashTable)又叫做散列表,是根据关键码值(即键值对)而直接访问的数据结构。也就是说,它通过把关键码映射到表中一个位置来访问记录,以加快查找速度。看到这里你可能比较疑惑,它是怎么加快查找速度的?下一节就有说明!这个映射函数就叫做散列(哈希)函数,存放记录的数组叫做散列表。2、为什么哈希表的速度快?在数据结构中,我们对两种数据结构应该会非常熟悉:数组与链表...原创 2018-08-31 11:38:14 · 98346 阅读 · 18 评论 -
剑指offer:找到数组中重复的值(C+Java)
题目:在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3.分析:因为这个数组的长度是n并存放了n个数字,如果这个数组的数字没有重复,那么排序之后,它的数字和数组下标应该是一一对应...原创 2018-09-20 19:49:53 · 422 阅读 · 0 评论 -
剑指offer:不修改数组找出重复的数字(C+Java)
题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字重复。请找出这个数组中的这个数字,但是不能改变输入的数组。例如,如果输入长度为8的数组{2,3,4,1,0,6,5,2},那么对应的输出的重复数字就是2了。分析:看到这个,我脑子里第一个想到的就是两个for循环,直接就搞定了!但是这样的话,时间复杂度就会到O(n2)了,肯定不是一个好的办法。第二种就是创建一个...原创 2018-09-20 19:52:11 · 430 阅读 · 0 评论 -
归并排序
归并排序归并排序的思想就是分治法,分两步走,第一步,将需要排序的数组分解为子序列,对子序列进行排序;第二步就是对有序子序列进行排序,合并成一个有序的序列。public static void sort(int[] arr) { //临时数组 int[] tempArr = new int[arr.length]; sort(arr, tempArr, 0, arr.length -...原创 2019-07-22 12:13:36 · 348 阅读 · 0 评论