数据结构

做了几年程序员,某天居然发现自己没学过数据结构。。。

左心房为你撑大大i 提交于 2020-02-27 03:06:10
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 听听这是人话么,我帮你们翻译一下,其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述。 本文思维导图 为什么要学数据结构 了解了基本概念之后,接下来我们再来看看,为什么我们要学习数据结构呢? 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。 许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。 也就是说,选定数据结构往往是解决问题的核心,比如我们做一道算法题

数据结构与算法学习第一天

浪尽此生 提交于 2020-02-27 02:55:17
算法的概念 : 算法是计算机处理信息的本质。当算法处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址以供以后调用。 算法是独立存在的一种解决问题的方法和思路,语言并不重要,重要的是思想。 算法的特征 : 1.输入:算法具有0个或多个输入 2.输出:算法至少有一个或多个输出 3.有穷性:散发在有限的步骤之后会自动结束而不会无限 循环,并且每一步骤可以在可接受的时间内完成。 4.确定性:算法中的每一步都有确定的含义,不会出现二义性。 5.可行性:算法的每一步都是可行的,也就是说每一步都能够在执行有限的次数内完成。 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。同一个问题会有多种算法,算法之间的效率是有差别的。计算机执行环境不同,因此单纯依靠运行时间来比较算法的优劣并不一定是客观准确的。 时间复杂度与“大O记法” : “大O记法”:对于函数f,总有f(n)≤c*g(n),忽略常数c的情况下,函数g是f的一个渐进函数,记为f(n)=O(g(n))。也就是说,在去向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。 时间复杂度:假设存在函数g,使得算法A处理规模为n的问题实例所用时间为T(n)=O(g(n)),则称T(n)=O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,记为T(n)。例如

学习笔记2.26

纵然是瞬间 提交于 2020-02-27 02:28:37
2.26 9—11:30 看《Java疯狂讲义》 笔记: 15:00—17:30 上网课 :离散数学 看数据结构与算法 19:30—22:00 看数据结构与算法 散列查找 写博客 https://blog.csdn.net/huyidai/article/details/104521403 心得:离散数学 的第一节课感受到这是一门可以提高抽象思维和逻辑推理能力的课程,对程序语言设计与数据结构基础都是必不可少的课程。 来源: CSDN 作者: huyidai 链接: https://blog.csdn.net/huyidai/article/details/104523771

大规模单位实时游戏寻路的构建

China☆狼群 提交于 2020-02-27 02:28:24
本文发布于游戏程序员刘宇的个人博客,欢迎转载,请注明来源https://www.cnblogs.com/xiaohutu/p/10504586.html 某个神秘的时间,我接到了一项神秘的任务,最核心的难度是要求实现:引擎是Unity3D,在手机端可以流畅运行为前提,在一个实时战斗的过程里,地图有地形(而且是会被动态改变的地形),数百个单位独立AI寻路、要实现忽略掉部分单位的筛选寻路、动态避障、满足帧同步需求并可以被服务器验证。可以说这个需求是集合了各种难点于一身。在这个任务的过程里,发现网上这样的文章比较少,所以想总结分享一下。着重于算法和思路这一块,不涉及图形上的问题。 一. 通常怎么做 需要寻路,又需要避障,先说一些常规的解决思路: 1.1 寻路 寻路就是基于既有的数据寻找到符合条件的一条路线: 1. 拿来主义类:用unity3d自己的NavMesh、自己的A* project,包含了寻路数据的生成和计算。 2. 进阶类:格子寻路可以用:   自己写A* 算法,进行常见的优化(二叉堆优化、HOT优化等等等等), 分层A*   JPS以及各种优化(位运算,剪枝,预处理等)   Dijkstra(扩展Dynamic A*)   DFS, BFS   。。。   (后续开文详解) 1.2 避障部分 合理的通过改变自己的行为(速度,方向)来避免穿插: 0. 真实物理 1.

Solidity基本数据结构

一世执手 提交于 2020-02-26 23:35:05
任何一个智能合约都会在最开头表示使用的编译器版本 如:prama solidity ^0.4.0 数组:   //静态数组 大小长度确定   uint[2] fixedArray;   //动态数组,可以随意添加元素   uint[ ] fixedArray;   使用push指令来添加 fixedArray,push()//添加后会返回一个引索值   //公共数组,使用关键字public。可以被别人调用读取但是不能修改   uint[ ] public people;   //struct数组   结构体[ ] 数组名   数组.push()返数组的长度跟C一样的应用数组下标    定义函数: function eatHamburgers(string_name,uint _amout){ } function 函数名(参数){ } 在solidity中的函数默认为公有,但是可以设置为私有。可以保护合约 function _addToArray(uint _number) private {   函数体 }//在函数后面添加private即可。和函数的参数类似私有函数的用下划线开始 跟Go语言同样是可以定义返回值的类型 function _addToArray() public returns (string){ //需要注意的是这里是returns } 函数修饰符分为

数据结构与算法系列二(复杂度分析)

末鹿安然 提交于 2020-02-26 23:33:23
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在开篇中提到了复杂度分析,与大O表示法的概念。具体要如何进行复杂度分析

【经典数据结构】B树与B+树

放肆的年华 提交于 2020-02-26 23:31:53
原文: 【经典数据结构】B树与B+树 本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5

python-数据结构-DAY_3

爷,独闯天下 提交于 2020-02-26 23:27:33
1.链表及其结构 链表是一种线性表,节点与节点之间靠一条链连接,从一个点出发,可以找到链上的所有数据 从图中可以看到,头节点是0x11,尾节点是0x21,链表与顺序表是不同的,每一个数据自己构成一个存储单元,一个存储单元包括自身数据加上目标地址,这样就可以通过目标地址到下一个存储元素。 2.单链表的常用操作 3.python独有交换数据的方式 a = 10 b = 20 a , b = b , a python是所有语言中交换数据最方便的语言,这跟他的存储形式有关,变量a,b在未告知具体类型的时候,他就是一个存放地址的存储单元,通过存储的地址去访问数据,如果设定了数据类型,那么他只能操作包含对应类型的数据。 4.链表常用的一些语句 创建一个对象,在创建函数 class node ( self ) : cur = self . _head 将cur游标设定为自身变量的头部 cur = cur . next 将游标指向链表的下一个存储单元 cur = cur . prev 游标指向上一个存储单元 通过上述的步骤就可以判断链表长度,获取指定位置信息等功能了 5.单链表与是顺序表的对比 6.双向链表 双向链表区别于单向链表,双向链表的存储单元结构是表头+数据+表尾,在操作上会有关于表头的操作(.prev),单向链表基本不会涉及表头操作,直接指向存储结构的数据 7.单向循环链表

数据结构与算法——串、数组和广义表(特殊矩阵的压缩存储)

吃可爱长大的小学妹 提交于 2020-02-26 22:29:05
特殊矩阵的压缩存储 矩阵的常规存储:将矩阵描述为一个二维数组。 矩阵的常规存储的特点:1、可以对其元素进行随机存取;2、矩阵运算非常简单;3、存储的密度为1. 特殊矩阵:值相同的元素很多且呈某种规律分布;零元素多。(对称矩阵、对角矩阵、三角矩阵、稀疏矩阵) 压缩存储:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。 1、对称矩阵 特点:a ij =a ji (1<=i,j<=n) 存储方法:只存储下(或上)三角包括主对角线的数据元素,共占用n(n+1)/2个元素空间。 存储结构:可以以行序为主序将元素存放在一个一维数组中。 元素 a 11 a 21 a 31 a 32 … a nn k 0 1 2 3 … n(n+1)/2-1 下半三角:对于a ij 来说,其在一维数组中的下标k=i(i-1)/2+j-1。 2、对角矩阵 3、对角矩阵 对角矩阵使用二维数组进行存储。以0为主对角线展开。 4、稀疏矩阵 矩阵中非零元素占所有元素小于5%的矩阵叫稀疏矩阵。 存储方法: 1、三元组顺序存储 ,包括非零元素所在行和所在列以及非零元素的值,再加上矩阵的大小(总行数,总列数)。 例如:{(1 (行) ,2 (列) ,12 (值) ),(3,5,25),… } 三元顺序表优点 :非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。 缺点 :不能随机存取

数据结构和对应的集合

試著忘記壹切 提交于 2020-02-26 22:18:11
栈结构和队列结构 栈: 先进后出。 队列: 先进先出。 6.数组和链表 数组: 在内存中是一片连续的空间。 查询快,增删慢。 查询快:因为可以通过数组的地址值和索引直接定位到某个元素。 增删慢:因为数组不可变,每次要添加或者删除都要创建一个新的数组。 把老数组中的元素赋值给新数组。 链表: 是多个节点组成的。 每一个节点都是单独new出来的对象,在内存中链表不是一个连续的空间。 是通过互相记录地址值实现的。 单向链表: 前一个记录后一个地址值。 但是后一个不会记录前一个地址值。 双向链表 也是由节点组成的。 前一个记录后一个地址值。 后一个也会记录前一个。 7.ArrayList 和 LinkedList ArrayList : 底层是一个数组。 特点:查询快,增删慢 LinkedList : 底层是一个双向链表。 特点:查询慢,增删快 总结: ArrayList 和 LinkedList 基本使用是一模一样的。 增 删 改 查,所写代码几乎一样。 但是在底层数据结构是不一样的。 8.LinkedList void addFirst(E e) 向集合中第一个位置添加元素 void addLast(E e) 向集合中最后一个位置添加元素 E getFirst() 获取集合中第一个元素 E getLast() 获取集合中最后一个元素 E removeFirst() 删除集合中第一个元素