算法与数据结构

数据结构 期末复习(1) 数据结构基本概念与顺序表基本操作

痴心易碎 提交于 2019-12-05 21:55:24
数据结构基本概念与顺序表基本操作 判断题 若用链表来表示一个线性表,则表中元素的地址一定是连续的。F 解析:存储方式为链式存储,地址可以是连续的也可以是分散的。 抽象数据类型中基本操作的定义与具体实现有关。F 解析:!!抽象数据类型、存储结构定义 单选题 在数据结构中,与所使用的计算机无关的数据结构是(A) A. 逻辑结构 B. 存储结构 C. 逻辑结构与存储结构 D. 物理结构 从物理存储上可以把数据结构分为 B A. 动态结构、静态结构 B. 顺序结构、链式结构 C. 线性结构、树形结构、图形结构和集合结构 D. 基本结构、构造型结构 下列关于数据的逻辑结构的叙述中,(A)是正确的。 A. 数据的逻辑结构是数据元素间关系的描述 B. 数据的逻辑结构反映了数据在计算机中的存储方式 C. 数据的逻辑结构分为顺序结构和链式结构 D. 数据的逻辑结构分为静态结构和动态结构 图形结构中元素之间存在(C)关系。 A. 一对一 B. 一对多 C. 多对多 D. 多对一 以下说法正确的是(D)。 A. 数据元素是数据的最小单位 B. 数据项是数据的基本单位 C. 数据结构是带有结构的各数据项的集合 D. 一些表面上很不相同的数据可以有相同的逻辑结构 数据的(B)包括集合、线性结构、树形结构和图形结构四种基本类型。 A. 存储结构 B. 逻辑结构 C. 基本运算 D. 算法描述

go-数据结构

痴心易碎 提交于 2019-12-05 20:34:14
数据结构 数据结构(算法)的介绍 数据结构的介绍 1) 数据结构是一门研究算法的学科,只从有了编程语言也就有了数据结构.学好数据结构可以编写 出更加漂亮,更加有效率的代码。 2) 要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决. 3) 程序 = 数据结构 + 算法 20.2 数据结构和算法的关系 算法是程序的灵魂。 为什么有些网站能够在高并发,和海量吞吐情况下依然坚如磐石,大家可能会 说: 网站使用了服务器群集技术、数据库读写分离和缓存技术(比如 Redis 等),那如果我再深入的问 一句,这些优化技术又是怎样被那些天才的技术高手设计出来的呢? 大家请思考一个问题,是什么让不同的人写出的代码从功能看是一样的,但从效率上却有天壤之别 曾经我听有人是这么说的:" 我是做服务器的,环境是 UNIX,功能是要支持上千万人同时在线, 并保证数据传输的稳定, 在服务器上线前,做内测,一切 OK,可上线后,服务器就支撑不住了, 公 司的 CTO 对我的代码进行优化,再次上线,坚如磐石。那一瞬间,我认识到程序是有灵魂的,就是 算法。拿在公司工作的实际经历来说,如果你不想永远都是代码工人,那就花时间来研究下算法吧!" 稀疏 sparsearray 数组 先看一个实际的需求 编写的五子棋程序中,有存盘退出和续上盘的功能

.Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较

一笑奈何 提交于 2019-12-05 20:15:26
.Net 中HashTable,HashMap 和 Dictionary<key,value> 和List 和DataTable的比较 转载自http://www.cnblogs.com/jilodream/p/4219840.html (一)HashTable 和Dic 数据结构 Hashtable和Dictionary从数据结构上来说都属于Hashtable(哈希表),都是对关键字(键值)进行散列操作,将关键字散列到Hashtable的某一个槽位中去,不同的是处理碰撞的方法。散列函数有可能将不同的关键字散列到Hashtable中的同一个槽中去,这个时候我们称发生了碰撞,为了将数据插入进去,我们需要另外的方法来解决这个问题。 采用链表法的是Dic 而采用开放寻址法(open addressing)-中 双重散列的方法的是 HashTable 至于这两种数据结构的使用方法 请自行阅读算法导论 或者参照网上博客 但从底层的数据结构可以发现 如果增删的动作很多的话 推荐使用Dic 因为解决碰撞的方式 是List.Add 如果改动的动作很少 查询的动作很多的话 则推荐 使用HashTable 因为映射查找之后 只需要跳跃查找到 碰撞后移动数据即可,另外当增加数据太多时,开放寻址的扩容很耗费性能(请阅读<算法导论>) Dic 和HashTable使用比较 1:单线程程序中推荐使用

王道数据结构——树与二叉树

微笑、不失礼 提交于 2019-12-05 18:11:45
本文主要讲述了数据结构中树的基本概念,二叉树,树与森林以及树与二叉树的应用。 知识框架如下图所示: 树的基本概念 树是N(N>=0)个结点的有限集合,N=0时,称为空树。 而任何一棵非空树应该满足,有且仅有一个根结点,当N>1时,其余结点又可以分为几个互不相交的有限集合,其本身又构成一个树(体现递归的定义),称为根结点的子树。需要特别说明的一个重要结论是,任何一个有N(N>=1)个结点的树都有N-1条边。 二叉树的基本概念 二叉树是一种特殊的树形结构,其特点是不存在度大于2的结点,且每个结点的子树(若有)均存在左右之分,其次序不能颠倒。 严格一点来说,二叉树是n(n>=0)个结点的有限集合。 1,n=0时,表示空二叉树。 2,n>0时,由根结点和互不相交的被称为根的左子树和右子树组成,而左子树和右子树也分别是一颗二叉树。 几种特殊的二叉树:满二叉树,完全二叉树,排序二叉树,平衡二叉树。 二叉树的存储结构 顺序存储结构,将一棵二叉树用0填充成一棵满二叉树,对于每个结点i,双亲结点为floor(i/2),左孩子为2*i,右孩子为2*i+1。 1 //二叉树的顺序存储结构 2 #define MAX_TREE_SIZE 100 3 typedef int SqBiTree[MAX_TREE_SIZE]; 4 SqBiTree bt; 5 6 //二叉树的链式存储结构 7 typedef

算法与数据结构

烂漫一生 提交于 2019-12-05 16:36:13
代码基于Python3 1. 算法的特征? 有穷性: 一个算法必须保证执行有限步骤之后结束; 确切性: 算法的每一步骤必须有确切的定义; 输入:一个算法有 0 个或多个输入,以刻画运算对象的初始情况,所谓 0 个输入是指算法本身给出了初始条件; 输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次数运算后即可完成。 2.冒泡排序的思想 冒泡思想:通过无序区中相邻记录的关键字间的比较和位置的交换,使关键字最小的记录像气泡一样逐渐向上漂至水面。整个算法是从最下面的记录开始,对每两个相邻的关键字进行比较,把关键字较小的记录放到关键字较大的记录的上面,经过一趟排序后,关键字最小的记录到达最上面,接着再在剩下的记录中找关键字次小的记录,把它放在第二个位置上,依次类推,一直到所有记录有序为止 复杂度:时间复杂度为 O(n²),空间复杂度为 O(1) def bubble_sort(alist): """冒泡排序""" for j in range(len(alist)-1, 0, -1): # j表示每次遍历需要比较的次数,是逐渐减小的 for i in range(j): if alist[i] > alist[i+1]: alist[i], alist[i+1] = alist[i+1],

20182311 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结

浪子不回头ぞ 提交于 2019-12-05 15:26:06
目录 教材学习内容总结 教材第十九章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 结对及互评 点评过的同学博客和代码 上周错题总结 学习进度条 参考链接 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 教材第十九章 非线性结构——图 基本概念: 定义:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 邻接:若图中的两个顶点之间有边连接,那么他们是邻接的。 有向图(Directed graphs):图中任意两个顶点之间的边都是有向边。 无向图(Undirected graphs):图中任意两个顶点之间的边都没有方向。 入度(In-degree) : 表示有多少条边指向这个顶点 出度(Out-degre) : 表示有多少条边是以这个顶点为起点推向其他顶点 带权图:每条边对应一个权值,又称为网络。路径上的权轻易为路径中所含边上的权值之和。 最小生成树:所含边的权值之和小于等于图的任意其他生成树的边的权值之和的生成树。基于带权图实现最小生成树的算法思路如下: 将图各边按照权值进行排序 将图遍历一次,找出权值最小的边,加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。 递归重复步骤1,直到找出n

数据结构之第一章 引论 及 课后题答案

谁说胖子不能爱 提交于 2019-12-05 12:45:13
数据结构之第一章 引论 及 课后题答案 写代码许多年,总是觉得浮于表面,不能深入,看大神说研究一下数据结构和算法可以改进不少,所以决定学习一下,课本采用 《数据结构与算法分析:c语言描述》 来学习。 第一章主要是介绍了本书的主旨是为了解决什么问题,并简单以选择问题和填字游戏问题做了简单介绍,初次之外对要用到的数学知识(指数、对数、级数、模运算和证明方法)做了一个简要介绍,不至于在后续的学习过程中因为不懂而懵逼。本文的组织形式如下: 知识点总结—思维导图 课后习题练习 知识点总结 知识点的总结,如下图所示: 简介如下: 选择问题 :在N个数中,选择打印出大小排名为k的数。思路有两个,一是将N个数排序,打印第k个数即可。二是在N个数中,随便取k个数放在数组a中,降序排列,然后遍历剩下的N-k个数,每个数都与a[k-1]比较,如果小于a[k-1]则忽略,如果大于a[k-1],则将这个数插入到a中合适的位置,并把a数组顺延,直到最后,得到的数就是要的数值。更有效的方式,书中将在后续给出,此处不做说明。该问题的代码将在 课后题1 中解答。 找单词 :给出N个单词,和一个二维字符数组,每个二维数组的值都是字符,要求按照二维数组的行、列及对角线的值进行拼接,能够找到这N个单词。书中同样给了两个方法来解决这个问题。一是对单词表中每个单词,检查二维数组的每行、列和对角线,验证单词存在不存在

《数据结构与面向对象程序设计》第10周学习总结

痞子三分冷 提交于 2019-12-05 11:27:18
学号20182329 2019-2020-1 《数据结构与面向对象程序设计》第10周学习总结 教材学习内容总结 实现二叉排序树,并学会编写删除、添加、插入,还有二叉排序树的遍历 学习图的有关知识,了解有向图和无向图的区别, 学习带权图,学会计算带权图的算法,最佳的算法。 学习图的各种遍历,比如深度优先遍历和广度优先遍历。 学习生成最小树的方法 学会生成图的邻接矩阵的方法,还有计算每个节点的出度入度方法实现 学会每个图的计算度的方法,还有不通过遍历进行的。 教材学习中的问题和解决过程啊 问题1:在学习计算带权图的各个路径上的带权值值之和时,发现自己用中序遍历的方法将带权图的总值计算出来,但是在计算各个节点上的带全值时,有些节点总是少一个全职。 问题1解决方法:后来认识到图不一定是完全二叉树,所以在进行这个遍历时会少掉一些全职或者说是子叶,然后我用学习了深度优先遍历的代码,虽然算法比较慢,但是可以不遗漏,一下是深度优先遍历的代码: public void dFS_AM(int site) {               //输入深度优先遍历的开始顶点 System.out.println(this.vexs[site]);         //输出该顶点 this.visited[site] = true;               //置访问标志为true for(int i =

数据结构与算法四:队列

泄露秘密 提交于 2019-12-05 09:49:49
队列顾名思义就是排队一样,先来的先出去,所有性质就跟排队一样,是一模一样,所有你想得到关于排队有的性质,队列都有,那么队列的应用实际上在操作系统上是非常丰富的,至于为什么我每次都要说一说操作系统是因为我想阐述为什么这些数据结构很重要,即使我们出去水平不够找不到很核心的工作,每天可能天天写业务代码(基本上就是调用接口,写写增删改查什么的),基本上不可能接触到这些东西,但还是要努力的学这些东西的最直观的意义是什么。 在操作系统中,所有的调度,存储都是基于这些数据结构,好了,我们开始谈一谈队列在操作系统中的应用吧,首先,调度算法,你能想到的各个方面的调度都少不了队列,FIFO方式就是直接利用队列表现得,还有什么多级反馈队列,等等,简单地说, 队列就是为了也是保证记录下时间或者某种顺序得数据存储结构 接下来,我们开始实现吧: 那么,我们需要依托什么基本结构去实现呢,数组?,我们仔细回想一下,每一次新的都是插入在最后面的,而每一次被服务得都是在最前面的,那么每服务一次,最前面就会被空出来,然后我需要挪动整体往前一格,不然就浪费内存了,故这显然是不科学得,因此,我们在处理队列得时候,一般都会选择循环数组和万能得链表 首先是基于简单循环数组的实现: struct queue{ int front,rear; int capacity; int *array; }; struct queue *q

常用数据结构操作与算法复杂度总结

元气小坏坏 提交于 2019-12-05 07:15:20
目录 时间复杂度 常用数据结构操作与算法的复杂度 输入规模较小时的情况 引用 博客: blog.shinelee.me | 博客园 | CSDN 时间复杂度 如何评估一个算法的计算时间? 一个算法的 实际运行时间很难评估 ,当时的输入、CPU主频、内存、数据传输速度、是否有其他程序在抢占资源等等,这些因素都会影响算法的实际运行时间。为了公平地对比不同算法的效率,需要脱离开这些物理条件,抽象出一个数学描述。在所有这些因素中, 问题的规模往往是决定算法时间的最主要因素 。因此, 定义算法的时间复杂度 \(T(n)\) ,用来描述算法的执行时间随着输入规模的增长将如何变化,增长速度是怎样的 。 在输入规模较小时,运行时间本来就少,不同算法的差异不大。所以,时间复杂度通常关注的是输入规模 \(n\) 较大时运行时间的变化趋势,称之为 渐进复杂度 ,采用大O记号,表示 渐进上界 ,对于任意的 \(n >> 2\) ,若有常数 \(c\) 和函数 \(f(n)\) 满足 \[ T(n) \leq c \cdot f(n) \] 则记作 \[ T(n) = O(f(n)) \] 可以简单地认为, \(O(f(n))\) 表示运行时间与 \(f(n)\) 成正比,比如 \(O(n^2)\) 表示运行时间与输入规模的平方成正比,这样讲虽然并不严谨,但一般情况下无伤大雅 。 在 \(n\) 很大时