数据结构

数据结构与算法推荐书单

試著忘記壹切 提交于 2020-02-22 00:21:03
  对于入门的同学不建议过度追求看上去很经典的书籍,例如:《算法导论》/《算法》这些书。可以看一些相对容易看的书来入门,例如《大话数据结构》、《算法图解》。   《大话数据结构》这本书最大的特点是它将理论讲的非常有趣,不枯燥。而且每个数据结构和算法作者都结合生活中的例子进行讲解,虽然这本书有400+页,但是花两天事件读完应该是没有问题的。如果之前完全不懂数据结构和算法,可以从这本书开始。   《算法图解》和《大话数据结构》走得是同样的路线。“像小说一样有趣的算法入门书籍”,通俗易懂。它只有不到200页,所以内容比较少。看看这本书,能够让你对数据结构和算法有 个大概的认识。   入门书籍共同的问题是缺少细节,不够系统,有不够严谨。如果想系统的学习学习数据结构和算法仅靠这两本书是不够的。   《数据结构和算法分析》国内外有很多大学拿这本书当作教材。这本书非常系统/全面/严谨,而且不是特别难,适合对数据结构有一定的了解,同时至少掌握了一门编程语言的人。这本书有三个版本:《数据结构与算法分析:C语言描述》/ 《数据结构与算法分析:C++描述》/ 《数据结构与算法分析:java语言描述》。   如果你熟悉的是其它编程语言可以看一下《数据结构与算法JavaScript描述》/ 《数据结构与算法:Python语言描述》。 面试刷题宝典:   《剑指offer》这本书的作者写作目的本明确

Java数据结构

烂漫一生 提交于 2020-02-21 19:12:40
一、线性数据结构 1、Java一维数组的创建   (1)预先定义数组的内存空间 int[] arr = new int[3];   // new int[3]是代表创建3个内存地址空间   // 地址空间的序号是按照0开始的,也就是说0为1号位置 arr[1] =2; //每二个内存地址空间都赋一个值 第二个位置赋值 2 arr[2] =4; //第二个内存地址空间赋值为 4 arr[0] =3; //第一个内存地址空间赋值为 3//for循环遍历arr每一个数组元素并且打印 for (int i=0;i<arr.length;i++) { System.out.println(arr[i]); }   (2) ArrayList的创建和使用 import java.util.ArrayList;import java.util.LinkedList;public class Case { public static void main(String[] args){ ArrayList data = new ArrayList(); //add是增加某个元素 data.add(1); data.add(3); data.add(2); data.add(4); for (int i=0;i< data.size();i++) { //get是通过索引获取元素 System.out

数据结构

我怕爱的太早我们不能终老 提交于 2020-02-21 14:24:38
2018-3-3 数据结构:是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科(ps:用来干什么用的) 程序设计的实质是选择一种合适的数据结构和一种好的算法来解决问题 1.数据:是用来描述客观事实的符号,是计算机中可以操作的对象,是输入给计算机能被识别并处理的符号集合,包括了数值类型和非数值类型(ps:前提条件是1.可以输入到计算机里去 2可以被计算机识别处理) 2.数据元素:是组成数据的有意义的基本单位(是数据结构中建立数据模型的着眼点但不是最小单位) 3.数据项:一个数据元素可以由若干个数据项组成,是数据里的最小单位 (不能分割) 4.数据对象:是性质相同(数据元素具有相同数量和类型的数据项叫性质相同)的数据元素的集合,是数据的子集(在实际运用中不发生混淆的情况下可以将数据对象简称为数据) 对应关系:数据→数据对象→数据元素→数据项 例:我有一个point数组 那么这个数组是数据对象 数组里的每一个point都是一个数据元素 point的x,y属性则为数据项 数据结构的定义:是相互之间存在一种或多种特点关系的数据元素的集合 数据结构分为两类:1.逻辑结构(数据对象中数据元素的对应关系又分为四种) (1)集合结构:数据元素同在一个集合没有特定关系(类似数组集合) (2)线性结构:存在一对一的关系 (3)树形结构:一对多 (4)图形结构:多对多

Java数据结构与算法->递归

感情迁移 提交于 2020-02-21 11:25:26
递归 递归设计思路 1.找重复 (子问题) 2.找重复中的变化量 -> 参数 3.找参数变化趋势 -> 设计出口 换句话说就是把一个任务划一刀分成两份,自己做一部分,委托别人做另外一部分。 练习策略 1.循环改递归 2.经典递归 3.大量练习,总结规律,掌握套路 递归的定义 1.自身调用自身 public class Main { public static void main ( String [ ] args ) { function ( 10 ) ; } static void function ( int i ) { if ( i == 0 ) { //退出递归的条件 return ; } function ( i - 1 ) ; //自身调用自身 } } 练习 求n*(n-1)的阶乘 public class Main { public static void main ( String [ ] args ) { f1 ( 10 ) ; } /* * f1(n):求n的阶乘 --> 求n-1的阶乘 * 找重复:n*(n-1)的阶乘,求(n-1)是问题的重复 * 找变化:变化的量应该作为参数 * 找边界:出口 */ static int f1 ( int n ) { if ( n == 1 ) { return 1 ; //因为1的阶乘就是1 } return n * f1

数据结构(第五章)

折月煮酒 提交于 2020-02-21 05:18:42
树下 第一讲 一.堆 什么是堆? 在讲堆之前,我们先看看什么是优先队列。 优先队列:是一种特殊的队列,从名称上看,优先,顾名思义,取出的元素是按照一定的优先级出队的,而不是元素进入队列的先后顺序。 优先队列的完全二叉树表示 堆的两个特性: 结构性 :用数组表示的完全二叉树。 有序性 :任一结点的关键字是其子树所有结点的最大值(或最小值)。 由最大值和最小值我们可以引出一个新概念“最大堆”“最小堆” 最大堆:每个结点的元素值不小于其子结点的元素值。 最小堆:每个结点的元素值不大于其子结点的元素值。 主要在最大堆的操作上面,因为最大堆会了,最小堆自然就不成问题了 最大堆的创建 typedef struct HeapStruct * MaxHeap ; struct HeapStruct { ElementType * Elements [ ] ; //存储堆元素 int Size ; //堆元素个数 int Capacity ; //堆的最大容量 } MaxHeap Create ( int MaxSize ) { MaxHeap H = malloc ( sizeof ( struct Heapstruct ) ) ; H -> Elements = malloc ( ( MaxSize + 1 ) * sizeof ( sizeof ( ElementType ) ) ; H ->

数据结构与算法作业3

自闭症网瘾萝莉.ら 提交于 2020-02-21 04:28:52
Leetcod27 题目 给定一个数组nums和一个值val,你需要原地移除所有数值等于val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1) 额外空间的条件下完成。 分析 首先,通过读题可以知道:已知:一个数组nums,一个值val。目标:将数值等于val的元素移除并返回新数组的长度。 由题意该题是要判断除数组nums中的数值等于val的元素,同时将数组中的这些元素移除。这就有点之前两次作业结合的感觉,所以干脆就用之前的想法进行编码。 解法一 首先就是暴力的都将nums中的所有元素都和val比较一下然后将不一样的都修改进nums中。 代码: class Solution { public : int removeElement ( vector < int > & nums , int val ) { int i = 0 ; for ( int j = 0 ; j < nums . size ( ) ; j ++ ) { if ( nums [ j ] != val ) { nums [ i ] = nums [ j ] ; ++ i ; } } return i ; } } ; 这就是通俗易懂的粗暴解法1.0。 解法二 在写完解法一,我突然感觉for语句以外的其他循环语句怎么样呢,于是我在微信交流群里和组员交流了一下

五分钟自学编程:怎样才能学好笔试面试最爱考察的算法

两盒软妹~` 提交于 2020-02-21 02:59:47
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是算法 上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和算法是息息相关的,为什么这么说呢,因为数据结构本身只是一个载体,而在数据结构之上产生作用和输出价值的东西其实是算法。 比如数据结构里的数组,看似非常简单的数据结构,却可以支持很多复杂的算法,比如动态规划,比如DFS和BFS,再比如字符串算法、二叉树算法等等。那么算法到底是什么东西呢,不妨让我们来看看官方的介绍。 根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 其实,算法的本质就是给你一组输入,运算之后给你一组输出,因此,算法帮人们解决很多问题把抽象的问题具体化,把一个问题转化成另外一个问题。 认识算法的N个阶段 我第一次遇到算法题,还是在我考研复习数据结构的时候,那个时候我看到的算法题其实都是很基础的题目,比如把数组中的两个元素置换,把两个链表合并成一个,但对于我来说已经是很有难度的事情了,那时候我连伪代码是什么都还不懂。 第二次认识算法,还是在研究生期间找实习工作的时候

1.3 图像的数据结构

天大地大妈咪最大 提交于 2020-02-21 02:11:31
数字图像处理中常用的数据结构有矩阵、链表、拓扑结构和关系结构 图像的数据结构用于目标表示和表述 1.3.1 矩阵 矩阵用于描述图像,可以表示黑白图像、灰度图像和彩色图像。 矩阵中的一个元素表示图像的一个像素 矩阵描述黑白图像时,矩阵中的元素取值只有0和1两个值,一次黑白图像又叫做二值图像或二进制图像 矩阵描述灰度图像时,矩阵中的元素有一个量化的灰度级描述,灰度级通常为8位,即0~255之间的整数,其中0表示黑色,255表示白色。现实中的图像都可以表示成灰度图像,根据图像精度的要求可以扩展灰度级,由8位扩展为10位、12位、16位或更高。越高的灰度值所描述的图像越细腻,对存储空间的要求也越大。 RGB彩色图像是由三原色红、绿、蓝组成的,RGB图像的每个像素都由不同灰度级的红、绿、蓝描述,每种单色的灰度描述同灰度图像的描述方式相同 1.3.2 链码 链码用于描述目标图像的边界,通过规定链的起始坐标和链起始点坐标的斜率,用一小段线段来表示图像中的曲 链码按照标准方向的斜率分为4向链码或8向链码 因为链码表示图像边界时,只需标记起点坐标,剩余点用线段的方向数代表方向即可 边界链码的表示与起始点的选取直接相关,起始点不同,链码的表示也不相同 为了实现链码与起始点无关,需要将链码归一化 简单的归一化方法将链码看成一个自然数,取不同的起始点,得到不同的链码

linux调度

一个人想着一个人 提交于 2020-02-20 18:06:16
调度的基本数据结构 1.每个cpu都有自己的一个struct rq, 里面有一个实时进程的struct rt_rq 和一个普通进程的struct cfs_rq。 在调度时,调度器首先会先去实时进程队列找是否有实时进程需要运行,如果没有才去CFS运行队列找是否有进程需要运行。 2.普遍进程的cfs_rq 定义如下 这里面的rb_root指向的就是红黑树的根节点,这个红黑树在CPU看起来就是一个队列,不断的取下一个应该运行的进程。 rb_leftmost指向的是最左面的节点 3.调度队列——红黑树,调度实体 完全公平调度算法CFS,CFS会为每一个进程安排一个虚拟运行时间vruntime。如果一个进程在运行,随着时间的增长,进程的vruntime将不断增大,但没有得到执行的进行vruntime将不变。 显然,那些vruntime少的,原来受到了不公平的对待,需要给它补上,所以会优先运行这样的进程。 高低优先级怎么处理?优先级其实就是一个数值,对于实时进程,优先级的范围是0-99;对于普通进程,优先级的范围是100-139.数值越小,优先级越高。 在计算vruntime的时候有一个公式 权重和nice数值有关系,nice越小权重就越大, NICE_0_LOAD是nice为0时的权重。所以从这个公式我们可以看出,高优先级(即nice值小的)的进程vruntime加的会少

数据结构——栈

你。 提交于 2020-02-20 04:44:38
1.什么是栈 先进后出,后进先出,这就是典型的栈结构 从栈的操作特性来看,是一种 操作受限 的线性表,只允许在端插入和删除数据 2.为什么需要栈 栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现 但任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险 所以,当某个数据集合只涉及在某端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,这个时候 栈 这种数据结构就能够排得上用场 3.如何自己实现栈 // 这里用到了泛型 public class MyStack<T> { //判断栈是否满 private boolean isFull() { } //入栈 public void push(T value) { } //判断栈是否为空 private boolean isEmpty() { } //出栈 public T pop() { } //获得栈顶元素,但不出栈 public T peek() { } } 数组实现 时间复杂度分析:数组实现(自动扩容)符合大多数情况是O(1)级别复杂度,个别情况是O(n)级别复杂度,比如在满的时候自动扩容时,会进行完整数据的拷贝 空间复杂度分析:在入栈和出栈的过程中,只需要一两个临时变量存储空间,所以O(1)级别。我们说空间复杂度的时候