数据结构和算法
信念随梦
本博客的主要作为自己的学习笔记,并不是以教授知识为目的。如果有人能从我的博客中学到东西,我很高兴。有人发现文章中有不对的地方,也欢迎大家纠正。
展开
-
树的高度和深度
用到树的数据结构时,经常会考虑树的高度和深度,但是lz总是搞混了,总虽然比较简单,就是个定义,记住就行了,但是因为长时间总是弄错,所以写一篇博文,加深一下印象1、树的深度 树的深度可以这样理解,计算一个节点的深度,从根节点算起(记住从1开始计数,而不是0,程序员的通病在这不好使),到该节点所经过的节点数(包括此节点)为树的深度,如下图B的深度为2,k的深度为5.树中最大深度的节点的深度为原创 2017-05-03 09:49:44 · 9453 阅读 · 2 评论 -
前缀、中缀、后缀表达式
它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。举例:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式中缀表达式(中缀记法)中缀表达式是一种通用的算术或逻辑公式表示方法转载 2017-05-11 15:09:08 · 425 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡非常形象,就是需要排序的数据像气泡一样,一个一个的冒上来,如果是升序,那么冒上来的就是最大的,降序就是最小的。 冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N原创 2016-11-08 21:04:50 · 297 阅读 · 0 评论 -
N的阶乘末尾有多少个0
问题:N的阶乘(N!)中的末尾有多少个0? 例如:N = 5,N! = 120.末尾有1个0. 分析:想到这个问题,有人可能第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。但是转念一想,会不会溢出,等等。 其实,从"那些数相乘可以得到10"这个角度,问题就变得比较的简单了。 首先考虑,如果N的阶转载 2017-07-17 16:56:19 · 1169 阅读 · 0 评论 -
二叉搜索树
一、什么是二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于等于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于等于它的根结点的值; 它的左、右子树也分别为二叉排序树。二、查询定义树的结点类为 cl原创 2017-07-30 11:25:53 · 270 阅读 · 0 评论 -
红黑树插入
一、什么是红黑树红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”(百度原创 2017-07-30 20:47:46 · 332 阅读 · 0 评论 -
红黑树删除
红黑树的删除和搜索二叉树的有些类似,但是也有很大的不同,主要的就是,红黑树删除以后会破坏红黑树的性质,需要就行调整。原创 2017-08-01 09:32:14 · 370 阅读 · 1 评论 -
求解最长递增子序列的长度
一,问题描述给定一个序列,求解它的最长 递增 子序列 的长度。比如: arr[] = {3,1,4,1,5,9,2,6,5} 的最长递增子序列长度为4。即为:1,4,5,9 二,算法分析有两种方式来求解,一种是转化为LCS问题。即,首先对数组排序,将排序后的结果存储在辅助数组中。排序时间复杂度O(NlogN),排序后的数组与原数组组成了LCS(N,N)问题。解决原创 2017-07-23 22:39:14 · 804 阅读 · 0 评论 -
找带环单向链表的环入口
题目:一个链表中包含环,请找出该链表的环的入口结点。这是一个在面笔试中问烂了的问题,虽然以前也做过,也知道怎么做,但是总是想推导出具体的数学公式,这样才具有 说服力,今天又重新温习了一下,做了一下数学公式的推导,然后做一下总结;1、做此类题首先得判断单链表 是否有环,当然这个题目已经告诉我们是有环的链表啦。判断有环的方法就是用两个快慢指针p1、p2,p2的速度为P1的两倍,原创 2017-04-10 21:27:26 · 489 阅读 · 0 评论 -
排序算法之快速排序
基本思想:1)选择一个基准元素,通常选择第一个元素或者最后一个元素,2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。3)此时基准元素在其排好序后的正确位置4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。下面我们通过一个案例来演示一下快速排原创 2016-12-15 20:50:36 · 410 阅读 · 0 评论 -
通过金矿模型介绍动态规划
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节转载 2016-11-25 21:59:02 · 346 阅读 · 0 评论 -
单链表的存储方式及实现(java语言描述)
顺序存储虽然是一种很有用途的存储结构,但也有很多局限性: (1)若要为线性表扩充存储空间,则需重新创建一个地址连续的更大的存储空间,并把原有的数据元素都复制到新的存储空间中; (2)因为顺序存储要求逻辑上相邻的数据元素,在物理存储位置上也是相邻,这就使得增删的数据元素会引起平均约一半的数据元素的移动。针对这些情况,我们通常采用链式存储结构。 链式存储原创 2016-06-25 21:29:30 · 4941 阅读 · 0 评论 -
归并排序
归并排序的计算复杂度要比冒泡,选择,插入要快的多,假设有N个数据,归并排序是需要把数组不断的进行二分,一直分到不能继续查分为止,所以需要拆分的次数为log2(N),即拆分成log2(N)组,又因为在每一组排序需要花费的次数是N,所以总共的运算复杂度为(o)Nlog2(N)public class MergeSort { private long[] theArray; pri原创 2016-10-13 08:31:25 · 237 阅读 · 0 评论 -
算法的力量----李开复
算法的力量2006年5月 李开复 算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其转载 2016-09-29 20:27:59 · 396 阅读 · 0 评论 -
排序算法之选择排序
选择排序作为冒泡排序的改进,交换次数从n的平方降为n。不过整体的时间复杂度还是n得平方(1)从待排序序列中,找到关键字最小的元素,记录下最下元素的位置;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。我们可以以下面一组数据作为测试:原创 2016-11-09 17:03:55 · 263 阅读 · 0 评论 -
排序算法之希尔排序
希尔排序来源于直接插入排序,简单一点的说,直接插入排序是与紧挨自己的元素比较大小,而希尔排序加大了比较的间隔,从而与直接插入排序相比减少了交换的次数。希尔排序的基本思想是:把记录按步长 h分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。除了比较间隔是在动态变原创 2016-11-16 15:12:25 · 234 阅读 · 0 评论 -
10进制转二进制
package com.company;import java.util.ArrayList;import java.util.List;public class Main { /* 循环判断的方法 */ public List t2b(int num){ List bnum =new ArrayList(); while(原创 2016-11-01 20:17:22 · 430 阅读 · 0 评论 -
排序算法之堆排序 Heap Sort
堆排序是一种选择排序,其时间复杂度为O(nlogn)。堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整; 若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)转载 2016-11-17 21:39:26 · 371 阅读 · 0 评论 -
排序算法之插入排序
插入排序是基于比较的排序。对于这类排序,就有两种基本的操作:①比较操作; ②交换操作其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置。(下面的插入排序就用到了这个技巧)--因为,交换操作需要三次赋值,而移动操作只需要一次赋值!步骤从第原创 2016-11-16 08:59:24 · 298 阅读 · 0 评论 -
重建二叉树
题目 输入某二叉树的前序遍历和中序遍历,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。 例如,前序遍历序列:{1,2,4,7,3,5,6,8},中序遍历序列:{4,7,2,1,5,3,8,6}分析分析前序遍历和中序遍历可知,前序遍历的第一个元素必定是树的根节点,如题根据前序遍历序列{1,2,4,7,3,5,6,8},可知1为树原创 2016-12-13 21:33:05 · 320 阅读 · 0 评论 -
线性表之顺序表
本文为《数据结构(java语言描述)》学习总结笔记,书中程序有一些小的错误,本人已做修改。原创 2016-06-24 16:02:23 · 1308 阅读 · 0 评论