数据结构与算法
Beyond_2016
这个作者很懒,什么都没留下…
展开
-
数据结构和算法
算法知识图谱算法转载:算法复杂度[算法] 常用数据结构小结转载:常用数据结构和算法操作效率的对比总结Java数据集总结ReferenceAndroid程序员面试会遇到的算法十大经典排序算法...原创 2018-07-25 10:22:51 · 230 阅读 · 0 评论 -
【算法】递归与while循环的区别
引入说起循环,我们大多会想到“递归、迭代、遍历”等几个词,具体的含义请看本文附录。今天只结合具体例子说一说递归和while循环的比较。两者的代码比较问:求1+2+3+…+n的和,请用两种方法写出代码?答: 递归代码: public static int Fun(int n){ if(n == 1){ r...原创 2018-07-30 12:34:59 · 4323 阅读 · 3 评论 -
迭代,循环,遍历,递归以及递归和尾递归
loop、iterate、traversal和recursion这几个词是计算机技术书中经常会出现的几个词汇。众所周知,这几个词分别翻译 为:循环、迭代、遍历和递归。乍一看,这几个词好像都与重复(repeat)有关,但有的又好像不完全是重复的意思。那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下。 1,循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如...原创 2018-07-30 12:51:29 · 1077 阅读 · 0 评论 -
拓扑排序的原理分析
拓扑排序,顾名思义,就是一种排序方法。这是一种什么排序?这种排序的作用?然后怎么去实现这种排序算法?现在就让我们仔细研究下。 1、什么是拓扑排序,也就是拓扑排序的概念实际上,拓扑排序是一种图论算法,该算法在《数据结构与算法》一书中有涉猎。引用维基百科的定义:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological so...原创 2018-07-30 15:19:13 · 926 阅读 · 0 评论 -
解决hash冲突的四种办法
目录开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公共溢出区 优缺点 开放散列(open hashing)/ 拉链法(针对桶链结构) 封闭散列(closed hashing)/ 开放定址法 通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。创建哈希表和查找哈希表...原创 2018-07-30 15:23:34 · 3710 阅读 · 0 评论 -
栈溢出几种情况及解决方案
一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。 解决这类问题的办法有两个, 一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。 ...原创 2018-07-30 15:41:39 · 21475 阅读 · 0 评论 -
常见的hash算法及其原理
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 哈希表是根据设定...原创 2018-07-30 15:47:13 · 243880 阅读 · 4 评论 -
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
问题:先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法的时间复杂度为O(nmlogm)(n为10亿,m为10000)。 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件...原创 2018-07-30 16:27:01 · 1368 阅读 · 0 评论 -
最快速度求两个数组之交集算法与hash
一个题目该题目来自58同城的二面,用最快速度求两个数组之交集算法。比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。 算法一:在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题。该题需要找出两个数组的交集,最简单的一个办法就是用A数组里面的所有数去匹配B数组里面的数。假设两个数组的大小都是n,...原创 2018-07-30 17:32:47 · 2188 阅读 · 0 评论 -
树的高度和深度
用到树的数据结构时,经常会考虑树的高度和深度,但是lz总是搞混了,总虽然比较简单,就是个定义,记住就行了,但是因为长时间总是弄错,所以写一篇博文,加深一下印象1、树的深度 树的深度可以这样理解,计算一个节点的深度,从根节点算起(记住从1开始计数,而不是0,程序员的通病在这不好使),到该节点所经过的节点数(包括此节点)为树的深度,如下图B的深度为2,k的深度为5.树中最大深度的节点的深度为...原创 2018-07-31 16:46:06 · 974 阅读 · 0 评论 -
经典算法题:谷歌面试经典题目
1.1 判断一个字符串中的字符是否唯一1.2 字符串翻转1.3 去除字符串中重复字符1.8 利用已知函数判断字符串是否为另一字符串的子串2.1 从链表中移除重复结点2.2 实现一个算法从一个单链表中返回倒数第n个元素2.3 给定链表中间某结点指针,删除链表中该结点2.4 求由两个链表结点组成的数之和2.5 给定一个循环链表,实现一个算法返回这个环的开始结点3.1...原创 2018-08-14 15:31:30 · 1658 阅读 · 0 评论 -
操作系统常见面试题大总结
1、什么是进程(Process)和线程(Thread)?有何区别? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程...原创 2018-08-03 10:00:25 · 897 阅读 · 0 评论 -
HashMap底层实现原理
这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JDK1.6.JDK1.7的。现在我来分析一哈最新的JDK1.8的HashMap及性能优化。 在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的...原创 2018-08-07 10:51:54 · 356 阅读 · 0 评论 -
笔试和面试中的海量数据问题
一. 原题重现 2015年9月27日百度笔试论述题二选一,其中第一道是关于MapReduce相关的;第二道是搜索引擎中url去重,海量数据集url如何在爬取过程中避免重复爬取过的url。 PS:通常搜索引擎网页去重是通过文档特征提取,再计算相似性或集合Hash实现。 下面是常见的题型: 1.Hash算法处理海量数据部分 ...原创 2018-08-08 14:49:37 · 622 阅读 · 2 评论 -
漫谈递归——递归需要满足的两个条件
很多人对递归的理解不太深刻。一直就停留在“自己调用自己”的程度上。这其实这只是递归的表象(严格来说连表象都概括得不全面,因为除了“自己调用自己”的递归外,还有交互调用的递归)。而递归的思想远不止这么简单。递归,并不是简单的“自己调用自己”,也不是简单的“交互调用”。它是一种分析和解决问题的方法和思想。简单来说,递归的思想就是:把问题分解成为规模更小的、具有与原问题有着相同解法的问题。比如二分查...原创 2018-07-27 09:44:31 · 11021 阅读 · 0 评论 -
C++实现二叉树镜像(翻转)
描述: 给定一个二叉树的根,将二叉树翻转 解决方案: 前序遍历二叉树,交换左右子节点 代码示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19...原创 2018-07-26 15:24:12 · 2626 阅读 · 0 评论 -
堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。堆 定义n个关...原创 2018-07-25 10:21:30 · 177 阅读 · 0 评论 -
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树
二叉排序树二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。中文名二叉排序树外文名Binary Sort Tree别 称二叉查找树、二叉搜索树别称外文名Binary Search Tree目录1 定义 2 查找 3 插入删除4 插入算法 5 删除结点 6 性能分析7 ...原创 2018-07-25 10:31:40 · 1273 阅读 · 0 评论 -
平衡二叉树
平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归...原创 2018-07-25 11:10:54 · 197 阅读 · 0 评论 -
哈夫曼树
一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plaincopyprint?if(score<6...原创 2018-07-25 14:22:38 · 237 阅读 · 0 评论 -
B树,B-树,B*树,B+和红黑树的区别
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,...原创 2018-07-25 14:39:34 · 13422 阅读 · 3 评论 -
树与二叉树的转换
树和二叉树不同,可以有0到n个孩子,所以实现起来很麻烦,但我们可以借助树的孩子兄弟表示法把树转换成二叉树。在孩子兄弟表示法中,某个结点的第一个孩子结点的指针是二叉树中其左孩子结点指针,右兄弟结点指针是二叉树中右孩子结点指针。树转换为二叉树过程:(1)树中所有相同双亲结点的兄弟结点之间加一条连线;(2)对树中不是双亲结点的第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,...原创 2018-07-25 16:06:46 · 2680 阅读 · 0 评论 -
AVL树,红黑树,B树,B+树原理及应用
二叉查找树简介二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不为空,则右子树的值均大于于根节点的值. 任意节点的左右子树也分别是二叉查找树. 没有键值相等的节点.局限性及应用一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个节点的线性链...原创 2018-07-25 16:14:02 · 243 阅读 · 0 评论 -
AVL树,红黑树,B树,B+树原理及应用
AVL树关于AVL树,之前写过一篇文章《数据结构——AVL树》,可以直接看这里,就不再熬诉。定义:1、左子树和右子树都是AVL树2、左子树和右子树的高度差不超过1 ,|HL-HR|<=1性质:1、一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)2、一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)).3、一棵n个结点的AV...原创 2018-07-26 10:28:46 · 305 阅读 · 0 评论 -
剑指offer题目及答案
剑指offer最近在牛客网上刷剑指offer的题目,现将题目和答案总结如下:1. 二维数组的查找2. 替换空格3. 从尾到头打印链表4. 重建二叉树5. 用两个栈实现队列6. 旋转数组的最小数字7. 斐波那契数列8. 跳台阶9. 变态跳台阶10. 矩阵覆盖11. 二进制中1的位数12. 数值的整数次方13. 调整数组顺序使奇数位于偶数前面14. 链表中倒数第k个结点...原创 2018-07-26 10:05:23 · 516 阅读 · 0 评论 -
十大经典排序算法
十大经典排序算法(动图演示)0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。 0.2 算法复杂...原创 2018-07-26 10:32:16 · 186 阅读 · 0 评论 -
七大查找算法
七大查找算法阅读目录1. 顺序查找 2. 二分查找 3. 插值查找 4. 斐波那契查找 5. 树表查找 6. 分块查找 7. 哈希查找 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找、插值查找以及斐波那契查找都可以归为一类——插值查找。插值查找和斐...原创 2018-07-26 10:36:47 · 326 阅读 · 0 评论 -
二叉树的翻转
阅读目录算法之:翻转二叉树反转二叉树输入一个二叉树,输出其镜像。如下图,即交换所有节点的左右子树。 这里提供两种思路:使用递归和不使用递归。使用的二叉树定义如下: 1 2 3 4 5 6 7 8 9 10 public class TreeNode { ...原创 2018-07-26 15:08:51 · 4592 阅读 · 2 评论 -
二叉树翻转实例
1.问题描述Invert a binary tree.For example:toGoogle: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.问题来源于Leetcodehtt...原创 2018-07-26 15:20:35 · 8050 阅读 · 0 评论 -
2019届华为笔试题(软件卷)
华为笔试题共3道编程题。第一题100分,第二题200分,第三题300分,一共600分。第一题:输入描述:1、忽略小数点,例如“A1.2”,认为包含整数1和2;2、如果整数的左侧出现“-”,则奇数个数认为是负整数,偶数个数认为是正整数。例如AB-1CD--2EF---3“”,认为包含整数-1、2和-3。输出描述:输出即为字符串中所有整数数字之和。#coding=utf-...原创 2018-08-30 15:01:35 · 12921 阅读 · 0 评论