算法与数据结构

数据结构(三)--栈

社会主义新天地 提交于 2019-12-18 00:32:01
/*--> */ /*--> */ /*--> */ /*--> */ 数据结构(三)--栈 通常程序开发中内存管理是非常重要的,而内存主要分为占内存和堆内存。那么栈和堆内存有什么区别呢?希望在这篇文章里能带你找到答案! 1. 栈和堆的引入 在一个简单的程序中我们定义和声明几个基本类型的变量、结构体和数组,先来直观看一下栈和堆的不同: 静态变量 和 局部变量是以压栈出栈的方式分配内存的,系统会在一个代码段中分配和回收局部变量,实际上每个代码段、函数都是一个或多个嵌套的栈,我们不需要手动管理栈区内存。 动态内存是一种堆排序的方式分配内存的,内存分配好后便不会自动回收,需要程序员手动回收。否则就会造成内存泄漏,内存越用越少。 简单了解了一下程序中内存栈与堆的区别,下面就正式开始讲数据结构中的栈。 (注意:数据结构栈、内存栈、函数调用栈三者在含义上略有不同,但是其核心思想和理念是相同的) 2. 栈的定义 栈是一种“先进后出”的一种数据结构,有压栈出栈两种操作方式。如下图: 3. 栈的分类 栈主要分为两类: 静态栈 动态栈 【静态栈】 静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶元素。 【动态栈】 静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶节点。 4. 栈的算法 栈的算法主要是压栈和出栈两种操作的算法,下面我就用代码来实现一个简单的栈。

数据结构笔记17-排序技术

最后都变了- 提交于 2019-12-18 00:24:40
在排序问题中,通常将数据元素称为记录 排序的基本概念 正序:待排序序列中的记录已按关键码排好序。 逆序(反序):待排序序列中记录的排列顺序与排好序的顺序正好相反。 趟:在排序过程中,将待排序的记录序列扫描一遍称为一趟。 通常,一次排序过程需要进行多趟扫描才能完成 排序算法的性能 1.时间复杂性:基本操作。 内排序在排序过程中的基本操作: (1)比较:关键码之间的比较; (2)移动:记录从一个位置移动到另一个位置。 2.空间复杂性: 辅助存储空间。 辅助存储空间是指在数据规模一定的条件下,除了存放待排序记录占用的存储空间 之外,执行算法所需要的其他存储空间。 排序算法的存储结构 从操作角度看,排序是线性结构的一种操作,待排序记录可以用顺序存储结构 或链接存储结构存储。 插入类排序 插入排序的主要操作是插入, 其基本思想是: 每次将一个待排序的记录按其关键码的大小插入到一个已经排好序的有序序列 中,直到全部记录排好序为止。 插入类排序方法有以下两种: 直接插入排序 希尔排序 直接插入排序 基本思想:在插入第 i(i>1)个记录时,前面的 i-1个记录已经排好序。 需解决的关键问题: (1)如何构造初始的有序序列? 解决方法: 将第1个记录看成是初始有序表,然后从第2个记录起依次插入到这个有序表中,直 到将第n个记录插入。 算法描述: for (i=2; i<=n; i++) {

Java数据结构和算法 - 堆

好久不见. 提交于 2019-12-17 22:53:53
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java、C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉树: 1) 是一棵完全二叉树 2) 通常由数组实现。前面介绍了 如何用数组表示树 3) 堆中的每个节点都满足堆的条件,即每个节点的关键字都大于(或等于)这个节点的子节点关键字 下图显示了堆与实现它的数组之间的关系: A: 堆是完全二叉树的事实说明了表示堆的数组中没有“洞”,从下标0到N-1,每个元素都有数据项 A: 本篇中假设最大的关键字在根节点,基于这种堆的优先级是降序的优先级队列 A: 若数组中节点的索引为i,则 1) 它的父节点的下标为(i - 1) / 2; 2) 它的左子节点的下标为 2 * i + 1; 3) 它的右子节点的下标为 2 * i + 2 Q: 弱序? A: 堆相对于二叉搜索树比较而言是弱序的,在二叉搜索树中所有的节点的左子孙的关键字都小于右子孙的关键字。二叉搜索树可以通过简单的算法就可以按序遍历节点,但在堆中,按序遍历节点是困难的,这是因为堆的组织规则比二叉搜索树的组织规则弱。 A: 对堆来说,只要求沿着从根到叶子的每一条路径,节点都是按降序排列 A: 在堆中不能便利地查找指定的关键字,因为在查找过程中,没有足够的信息来决定选择通过节点的哪一个子节点走向下一层

计算机导论第五次课后总结

為{幸葍}努か 提交于 2019-12-17 05:26:08
计算机导论第五次课后总结 计算机导论的第五堂课,我们学习完了第四章程序设计语言和第五章计算机中的数据的内容。 第4章 程序设计语言 4.4 并行程序设计 4.4.1 并行程序设计语言 并行程序设计语言是一种用于并行程序设计的语言。并行程序设计语言可分为显式并行语言和具有并行编译功能的串行语言。 4.4.2 并行程序语言的编译过程 源程序——词法,语法分析——程序优化——并行代码生成——进入处理机(超标量处理机、多处理机、多计算机)。 在编译过程中,首先要确定源程序中数据和控制的相关性。在进行相关分析时,要把程序流的模式分析出来。在编译过程中,还要进行程序优化。 4.4.3 OpenMP OpenMP是一个编译器指令和库函数的集合,主要用于共享式存储计算机上的并行程序设计。 第五章计算机中的数据 5.1 数据 5.1.1 数据的定义 数据就是用文字、数字、图形、图像声音等方式对人、事件事物等进行的描述。在计算机科学中,数据是指所有能输入计算机并能被计算机程序处理的符号的总称,数字、文本、音频、图形、图像和视频等统称为数据。 5.1.2 数据与信息的区别 通常来说,输入计算机的字母,数字等符号为数据。如果字母,数字等符号具有一定含义且能帮助人们完成某个动作或做出决策,那么就称它们为信息。数据是供计算机处理的,信息是供用户使用的。 5.1.3 计算机常用的编码方式 ASCⅡ 扩展ASCⅡ

数据结构与算法之队列

倖福魔咒の 提交于 2019-12-17 03:45:08
队列是一种只允许在一端插入数据(队尾),在另一端删除数据(队头)的操作的特殊线性表。 队列的特点:先进先出 队列可以用数组实现,称为顺序队列,又叫循环队列。也可以用链表实现,称为链式队列。 链式队列: package queue.com; public class MyListQueue { class Node { int data; Node next; public Node(int data) { this.data = data; } } Node front; Node rear; int usedSize; //判断是否为空 public boolean isEmpty() { return usedSize == 0; } // 入队(尾插) public void offer(int data) { Node node = new Node(data); if (isEmpty()) { this.front = node; this.rear = node; } else { this.rear.next = node; this.rear = node; } this.usedSize++; } //出队(从头出) public int poll() { int tmp = this.front.data; this.front = this.front

数据结构与算法之栈

丶灬走出姿态 提交于 2019-12-17 03:01:21
首先:栈是一个特殊的线性表,只允许在一端进行插入(压栈)和删除元素(进栈),这一端称为栈顶。 栈的实现可以用数组实现,称为顺序栈。时间复杂度为O(1) 也可以用链表实现称为链式栈。尾插入栈:O(n),出栈:O(n) 头插入栈:O(1),从头出栈O(1) 数组实现栈代码如下(运用了泛型): package stack.com; public class MyStack<T> { public T elem[]; int top; //top是当前能放元素位置的下标 public MyStack() { this.elem = (T[]) new Object[10]; this.top = 0; } //判断是否未满 private boolean isEmpty() { return top == elem.length; } //入栈 public void push(T val) { if (isEmpty()) { return; } elem[top] = val; top++; } //判断是否为空 private boolean isFull() { return top == 0; } //出栈 public T pop() { if (isEmpty()) { return null; } T tmp = elem[top-1]; top--; return tmp

大话数据结构笔记——第二章 算法

夙愿已清 提交于 2019-12-17 01:47:10
第二章 算法 算法 是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法(Algorithm)这个单词最早出现在波斯数学家阿勒·花刺子密在公元825年(相当于中国的唐朝时期)所写的《印度数字算术》中。 2.1 算法的特性 算法具有5个基本特性:输入、输出、有穷性、确定性和可行性。 2.1.1 输入输出 算法具有零个或多个 输入 。 算法至少有一个或多个 输出 。 2.1.2 有穷性 算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。 2.2.3 确定性 算法的每一步骤都具有确定的含义。 2.2.4可行性 算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。 2.2 算法设计的要求 2.2.1 正确性 算法的 正确性 是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。 分为 四个层次 (层次4验证复杂,代价较高,一般情况下以层次3为判断算法是否正确的标准): 1.算法程序没有语法错误。 2.算法程序对于合法的输入数据能够产生满足要求的输出结果。 3.算法程序对于非法输入数据恩能够得出满足规格说明的结果。 4.算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。 2.2.2 可读性 算法设计的另一个目的是为了便于阅读

数据结构与算法(四)双端栈——顺序存储结构

泄露秘密 提交于 2019-12-17 01:36:14
双端栈 双端栈定义 :是指将一个线性表的两端当做栈底分别进行进栈出栈操作。 双端栈既然也是栈,那就可以直接实现接口Stack,其操作与栈是一样的,只是相当于有两个栈,可以定义左栈和右栈,对于内部方法,分别讨论左右两个栈情况,再综合两者实现。 /* 双端栈 */ public class ArrayStackDoubleEnd < E > implements Stack < E > { private static final int DEFAULT_SIZE = 10 ; private E [ ] data ; //底层还是用动态数组实现 private int leftTop ; //左栈顶 private int rightTop ; //右栈顶 //构造函数 public ArrayStackDoubleEnd ( ) { this ( DEFAULT_SIZE ) ; //调用一个参的构造函数 } //创建一个指定的指定的双端栈 public ArrayStackDoubleEnd ( int capacity ) { data = ( E [ ] ) ( new Object [ capacity ] ) ; leftTop = - 1 ; rightTop = data . length ; } //获取左栈中有效元素个数 public int

数据结构与算法(五)队列——顺序存储结构

佐手、 提交于 2019-12-17 00:59:55
队列 队列的定义 :是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 例如像移动,联通、电信等客服电话,客服人员与客户相比总是少数,在所以客服人员都占线的情况 下,客户被要求等待,直到某个客服人员空下来,才能让最先等待的客户接通电话,这里将所以当前拨打客服电话的客户进行排队处理。客服系统就是应用了队列这种数据结构。 队列是一种先进先出的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。 首先定义队列接口Queue,写ArrayQueue实现这个接口,定义接口Queue的好处,之后再需要写队列的其他实现,只需要让它们实现这个接口,重写接口中的抽象方法即可。 那就先写Queue,Queue没有List那么多抽象方法,有判空、获取有效元素个数、进队、出队、获取队头、获取队尾、清空队列几个抽象方法即可。 public interface Queue < E > extends Iterable { //获取队列中元素的个数 int getSize ( ) ; //判断队列是否为空 boolean isEmpty ( ) ; //入队一个元素 void enqueue ( E e ) ; //出队一个元素 E dequeue ( ) ; //获取队头 E getFront ( ) ; //获取队尾 E getRear ( ) ; //清空队列 void clear ( )

浅谈算法和数据结构: 五 优先级队列与堆排序

邮差的信 提交于 2019-12-16 22:29:14
在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。最简单的一个例子就是,在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。 在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue) 。 本文首先介绍优先级队列的定义,有序和无序数组以及堆数据结构实现优先级队列,最后介绍了基于优先级队列的堆排序(Heap Sort) 一 定义 优先级队列和通常的栈和队列一样,只不过里面的每一个元素都有一个”优先级”,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。 优先级队列可以通过链表,数组,堆或者其他数据结构实现。 二 实现 数组 最简单的优先级队列可以通过有序或者无序数组来实现,当要获取最大值的时候,对数组进行查找返回即可。代码实现起来也比较简单,这里就不列出来了。 如上图: · 如果使用无序数组,那么每一次插入的时候,直接在数组末尾插入即可,时间复杂度为O(1),但是如果要获取最大值,或者最小值返回的话,则需要进行查找,这时时间复杂度为O(n)。 · 如果使用有序数组,那么每一次插入的时候,通过插入排序将元素放到正确的位置,时间复杂度为O(n)