数据结构

数据结构——树

[亡魂溺海] 提交于 2020-02-27 22:43:34
数据结构——树 树其实就是不包含回路的连通无向图。 树的特性: 1)一棵树中的任意两个结点有且仅有唯一的一条路径连通; 2)一棵树如果有nn个结点,则它一定有n−1n−1条边; 3)在一棵树中加一条边将会构成一个回路。 树这种数据结构的用途: 例如:家族的族谱图、公司的组织结构图、书的目录等。 1. 二叉树 二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。 二叉树用范围最广。一颗多叉树也可以转化为二叉树。 1) 满二叉树 :二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。 满二叉树是一棵深度为h且有2h−12h−1个结点的二叉树。 2) 完全二叉树 :若设二叉树的高度为hh,除了第hh层外,其他层的结点数都达到最大个数,第h层从右向左连续 缺若干个结点,则为完全二叉树。 特点: 由上图发现: 1)如果一棵完全二叉树的父节点编号为KK,则其左儿子的编号是2K2K,右儿子的结点编号为2K+12K+1, 公式总结: 2)已知完全二叉树的总节点数为n求叶子节点个数: 当n为奇数时:(n+1)/2 当n为偶数时 : (n)/2 3)已知完全二叉树的总节点数为n求父节点个数:为:n/2 4)已知完全二叉树的总节点数为n求叶子节点为2的父节点个数: 当n为奇数时:n/2 当n为偶数时 : n/2-1 5)如果一棵完全二叉树有N个结点,那么这棵二叉树的深度为

数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)

北城以北 提交于 2020-02-27 19:35:30
堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤 : 第一步: 是建立 大顶堆 (从大到小排序)或 小顶堆 (从小到大排序), 从下往上建立 ; 如建堆时, s是从大到小; 第二步: 是依次 交换 堆顶和堆底, 并把 交换后的堆底输出 , 仅仅排列剩余的堆, 从上往下建立 ; 如构造时, s始终是1; 堆排序(Heap Sort) 的 时间复杂度 是 O(nlogn) , 最坏情况 下也是如此. 而 高速排序(Quick Sort) , 若初始记录序列有序, 高速排序将退化为 起泡排序(Bubble Sort) , 时间复杂度是 O(n^2) . 这是堆排序比高速排序的 长处 . 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <stack> #include <queue> using namespace std; void HeapAdjust (int data[], int length, int k) { int tmp = data[k]; int i=2*k+1;

数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)

时光怂恿深爱的人放手 提交于 2020-02-27 19:30:51
树形选择排序 (tree selection sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 算法逻辑: 依据节点的大小, 建立树, 输出树的根节点, 并把此重置为最大值, 再重构树. 由于树中保留了一些比較的逻辑, 所以降低了比較次数. 也称 锦标赛排序 , 时间复杂度为O(nlogn) , 由于每一个值(共n个)须要进行树的深度(logn)次比較. 參考<数据结构>(严蔚敏版) 第278-279页. 树形选择排序(tree selection sort) 是堆排序的一个过渡, 并非核心算法. 可是全然依照书上算法, 实现起来极其麻烦, 差点儿没有不论什么人实现过. 须要 记录建树的顺序 , 在重构时, 才干降低比較. 本着娱乐和分享的精神, 应人之邀, 简单的实现了一下. 代码: /* * TreeSelectionSort.cpp * * Created on: 2014.6.11 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <vector> #include <stack> #include <queue> #include <utility> #include <climits> using

什么是数组?

依然范特西╮ 提交于 2020-02-27 18:58:35
今天要介绍的主角就是- 数组 ,数组也是数据呈线性排列的一种数据结构。与前一节中的 链表 不同,在数组中,访问数据十分简单,而添加和删除数据比较耗工夫。这和 什么是数据结构 那篇文章中讲到的姓名按拼音顺序排列的电话簿类似。 数组 如上就是数组的概念图,Blue、Yellow、Red 作为数据存储在数组中,其中 a 是数组的名字,后面 [] 中的数字表示该数据是数组中的第几个数据,该数字也就是 数组下标,下标从 0 开始计数 ,比如 Red 就是数组 a 的第 2 个数据。 那么 为什么许多编程语言中的数组都从 0 开始编号的呢 ?先别急,可以先自己思考下,将会在文末进行讲解。 从图中可以看出来,数组的数据是按 顺序存储 在内存的连续空间内的。 由于数据是存储在连续空间内的,所以每个数据的内存地址(在内存上的位置)都可以通过数组下标算出,我们也就可以借此直接访问目标数据,也就是 随机访问 。 比如现在我们想要访问 Red,如果是链表的话,只能使用指针就只能从头开始查找,但在数组中,只需要指定 a[2],便能直接访问 Red。 但是,如果想在任意位置上添加或者删除数据,数组的操作就要比链表复杂多了。这里我们尝试将 Green 添加到第 2 个位置上。 首先,在数组的末尾确保需要增加的存储空间。 为了给新数据 Green 腾出位置,要把已有数据一个个移开,首先把 Red 往后移。 然后把

程序员必须掌握的核心算法有哪些?

风流意气都作罢 提交于 2020-02-27 18:24:21
一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈? 二叉堆是什么鬼? 【算法与数据结构】堆排序是什么鬼? 3、哈希表(必学) 碰撞解决方法:开放定址法、链地址法、再次哈希法、建立公共溢出区(必学) 布隆过滤器(原理与应用) 哈希表相关的,推荐通过博客来学习,推荐文章: Hash冲突之开放地址法 4、树 二叉树:各种遍历(递归与非递归)(必学) 哈夫曼树与编码(原理与应用) AVL树(必学) B 树与 B+ 树(原理与应用) 前缀树(原理与应用) 红黑树(原理与应用) 线段树(原理与应用)

java 数据结构与算法---栈

旧街凉风 提交于 2020-02-27 17:03:51
原理来自百度百科 一、栈的定义 栈是一种只能在一端进行插入和删除操作的特殊线性表;它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来);栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针;插入一般称为进栈(PUSH),删除则称为退栈(POP)。 二、栈的实现 package com.jalja.org.arith; public class MyStack<E>{ private Object [] arr;//存储 private int index;//栈元素实际入栈索引 private int maxSize;//栈的最大空间 private MyStack(int maxSize) { this.arr=new Object[maxSize]; this.index=0; this.maxSize=maxSize; } //入栈 public void push(E e) { if(isFull()) { throw new RuntimeException("myStack is full "); } arr[index++]=e; } //出栈 public E pop() { if(isNull()) { throw new RuntimeException("myStack

堆、栈、堆栈、队列的区别

怎甘沉沦 提交于 2020-02-27 17:02:18
堆栈都是一种 数据项 按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 要点:堆:顺序随意 栈:后进先出(Last-In/First-Out) 堆 堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈 栈:什么是栈?又该怎么理解呢? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。 堆栈 堆栈

数据结构与算法之买卖股票的最佳时机

妖精的绣舞 提交于 2020-02-27 16:28:15
问题 解答 1.暴力解法 计算出每一天的最大利润,再找出最大利润(很复杂,而且会超时) def maxProfit ( prices ) : if len ( prices ) <= 1 : return 0 k = 0 lst = [ ] prices_copy = prices . copy ( ) for i in range ( 1 , len ( prices ) ) : for j in range ( i ) : if prices [ i ] - prices [ j ] >= 0 : n = prices [ i ] - prices [ j ] lst . append ( n ) prices_copy [ i ] = max ( lst ) else : prices_copy [ i ] = - 1 k += 1 if prices_copy . count ( - 1 ) == len ( prices ) - 1 : return 0 else : return max ( prices_copy [ 1 : ] ) print ( maxProfit ( [ 7 , 1 , 5 , 3 , 6 , 4 ] ) ) 2.动态规划 前i天的最大利润 = max{前i-1天的最大利润,第i天的价格-前i-1天中的最小价格} def maxProfit (

day1 对java的认识

杀马特。学长 韩版系。学妹 提交于 2020-02-27 13:19:16
对java的认识 1.java是一门跨平台的语言,由jvm进行预编译,转换成类似伪代码一样的东西,最后再转换成机器语言。 2.程序是由数据结构和算法构成,其他 所有的工具类,方法 都是 为数据结构或者算法 服务的。 3.面向对象思想是当今编程界的潮流。每一个类都有自己的属性和成员方法,然后不同类通过互相 实例化对象,调用方法,传参进行配合。 4.数据结构应该单独进行封装,算法通过实例化类对象,调用对象的方法进行实现。 来源: https://www.cnblogs.com/wangpeng111/p/12371598.html