数据结构
今天的技术超过许嵩了吗?
嘤,歌可以唱的不好,但是,技术不能比许嵩差~
展开
-
基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性...原创 2018-12-08 16:55:31 · 187 阅读 · 0 评论 -
计算时间复杂度~
最近在刷题准备校招,总是碰到计算时间复杂度的题,总是迷糊。今天就总结一下吧~可能会比较乱,因为是按照我以后能看懂的方式总结的~hh一、概念 首先我们先了解一下两个概念:一个是时间复杂度,一个是渐近时间复杂度。 前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。 ...原创 2019-03-04 18:46:28 · 200 阅读 · 0 评论 -
栈和队列学习总结
一、栈1、特点及应用 先进后出。(如果会和队列先进先出记混的话,就记场景吧:弹栈弹栈,就是把最上面的最新进来的弹出去;而队列就像我们火车站排队检票出站一样,谁排在前面谁就先出去。) 应用的话,其实我们经常接触呀。比如Undo操作(就是撤销操作)就是使用的栈的思想,以及程序调用的系统栈。下面我们举一个经典的括号匹配的例子: 题目要求:给定一个只包括...原创 2019-04-04 17:13:23 · 10877 阅读 · 2 评论 -
N个数依次入栈,出栈顺序有多少种?
一、N个数依次入栈,出栈顺序有多少种?我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出:f(1) = 1 //即 1f(2) = 2 //即 12、21...原创 2019-04-10 20:36:57 · 22431 阅读 · 5 评论 -
链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
以下排序算法的正确性都可以在LeetCode的链表排序这一题检测。本文用到的链表结构如下(排序算法都是传入链表头指针作为参数,返回排序后的头指针)struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };插入排序(算法中是直接交换节点,时间复杂度O(n...转载 2019-04-07 16:07:37 · 470 阅读 · 0 评论 -
链表学习总结
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快...原创 2019-04-07 21:15:07 · 1659 阅读 · 0 评论 -
集合与映射
一、集合1、 集合的应用集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计2、集合的实现(1)对于集合的一些定义,我们一般也都了解,例如集合一般都不会存放重复的元素,因此这就让它有了去重的功用了。public interface Set<E> { void add(E e);//不能添加重复元素 boolean c...原创 2019-04-11 22:45:01 · 703 阅读 · 0 评论 -
优先队列学习总结
队列: 现实中我们最常见的是,去医院挂号,去银行取钱,一般都需要排队,这就是队列,队列有一个最显著的特征: 先进先出,一般情况下,大多都是先到先办理,但是也是有特殊的情况,例如在医院,万一来个急诊的,一定是急诊的优先,或者在银行,来个VIP,有绿色通道。 这种特殊的情况下,就是队列中的特殊的队列:优先队列。它的实现方法:给入队的元素,赋予一个优先级,根据优先级,将其插入队列中,(...原创 2019-04-12 21:07:58 · 504 阅读 · 0 评论 -
数据结构——树学习总结(一)
一、二叉树二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。二叉树使用范围最广。一颗多叉树也可以转化为二叉树。1、满二叉树 二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。 满二叉树是一棵深度为h且有个结点的二叉树。2、完全二叉树 若设二叉树的高度为h,除了第h层外,其他层的...原创 2019-04-09 20:54:10 · 2720 阅读 · 0 评论 -
漫画算法:什么是红黑树?(转)
————————————二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为二叉排序树。下图中这棵树,就是一颗典型的二叉查找树:1.查看根节点9:2.由于10 > 9,因此查看右孩子13:...转载 2019-04-16 20:46:57 · 232 阅读 · 0 评论 -
定义有数组int a[200]={1,2,2,3,.....},数组元素都为正数,且a[i+1]>=a[i],请快速输出a[i]=i的数。
题目描述定义有数组int a[200]={1,2,2,3,.....},数组元素都为正数,且a[i+1]>=a[i],请快速输出a[i]=i的数。解题思路对于本题,最简单的办法就是对数组进行顺序遍历,判断遍历到的数是否满足条件,这种方法的效率显然是最低的。下面介绍另外一种方法,主要思路如下:如果a[i]>i,则接下来的a[i]-i-1个数一定不可能满足a[i]=i,...原创 2018-12-24 20:22:11 · 1808 阅读 · 0 评论 -
调度机任务调度问题
题目描述假设有一个中央调度机,有n个任务相同的任务需要调度到m台服务器上执行,由于每台服务器的配置不一样,因此,服务器执行一个任务所花费的时间也不同。现在假设第i个服务器执行一个任务需要的时间为t[i]。假如,有2个执行机a与b,执行一个任务分别需要7min和10min,有6个任务待调度。如果平分这6个任务,即a与b各3个任务,则最短需要30min执行完所有。如果a分4个任务,b分2个任务,则...原创 2018-12-24 16:59:16 · 1263 阅读 · 0 评论 -
生产者-消费者模型的实现代码
生产者-消费者问题也称有限缓冲问题,它是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。这个问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据。 生产者...原创 2018-12-15 14:34:39 · 478 阅读 · 0 评论 -
堆排序
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。它的任何一个父节点都比它的子树要大(大顶堆)它的任何一个父节点都比它的子树要小(小顶堆)升序排列使用大顶堆,降序排列使用小顶堆。package myself;import java.util.A...原创 2018-12-08 16:48:22 · 148 阅读 · 0 评论 -
简单选择排序
简单选择排序是指一种排序算法,在简单选择排序过程中,所需移动记录的次数比较少。最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录。方法是设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。(其实就是一句话:遍历一遍数组,把最小的数的...原创 2018-12-08 16:44:36 · 142 阅读 · 0 评论 -
希尔排序
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一...原创 2018-12-08 16:41:48 · 153 阅读 · 0 评论 -
直接插入排序
直接选择排序(Straight Select Sorting) 也是一种简单的排序方法,它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,...原创 2018-12-08 16:36:21 · 119 阅读 · 0 评论 -
归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 基本原理:通过对若干个有序结点序列的归并来实现排序。 所谓归并是指将若干个已排好序的部分合并成一个...原创 2018-09-23 22:48:18 · 182 阅读 · 0 评论 -
快速排序
快速排序,顾名思义,是一种速度快,效率高的排序算法。 快排原理: 在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。 整个快排的过程就简化为了一趟排...原创 2018-09-23 18:38:19 · 172 阅读 · 0 评论 -
寻找一条从左上角(arr[0][0])到右下角(arr[m-1][n-1])的路线,使得沿途经过的数组中的整数和最小
递归法 倒着来分析:最后一步到达arr[m-1][n-1]只有两条路,即通往arr[m-2][n-1]到达或者通往arr[m-1][n-2]到达,最后一步选择的路线为min{f(m-2,n-1),f(m-1,n-2)},同理可递归选择到arr[m-2][n-1]或arr[m-1][n-2]的路径。这种递归方法效率太低,因为里面有大量的重复计算过程,比如在计算(i-1 ,j)与f(j-1,i)的...原创 2018-12-16 21:21:25 · 1335 阅读 · 0 评论 -
实现对一组无序的字母进行从小到大排序(区分大小写),当两个字母相同时,小写字母放在大写字母前。要求时间复杂度为O(n)
如果没有时间复杂度的要求,这题可以采用传统的插入排序或者快速排序等方法进行排序,但是传统的排序方法在最好的情况下的时间复杂度都为O(nlogn),显然,不满足题目要求。对于时间复杂度有很高要求的问题,一般可以考虑用空间换时间的方法。这题可以采用如下思路: 通常,字母为26个,当区分大小写后,变为52个,所以先申请一个长度为52的int型数组,按照aAbBcC...zZ...原创 2018-12-19 15:40:20 · 2347 阅读 · 3 评论 -
扫描指定文件夹下面所有以.txt结尾的文件,并将其绝对路径输出
主要思路: 首先,找到指定路径下的所有文件; 然后,判断这些文件是否以.txt作为后缀,如果是,则为要找的文件,此时输出其绝对路径,否则,继续查找,直到遍历完所有文件为止。package InterView;import java.io.BufferedReader;import java.io.File;imp...原创 2018-12-15 19:48:15 · 3285 阅读 · 0 评论 -
最短路径算法
一、最短路径问题介绍1、问题解释:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径2、解决问题的算法:迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 bellman-ford算法二、Dijkstra算法1、算法特点:Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所...原创 2019-06-05 16:28:48 · 1104 阅读 · 0 评论