算法与数据结构

数据结构--绪论

故事扮演 提交于 2020-02-26 16:38:10
数组求和的迭代和递归求法 迭代版本 int SUMI(int A[], int n) { int sum = 0; //O(1) for (int i = 0;i < n;i++) { //n sum += A[i]; // O(1) } return sum; // O(1) } 递归版本 int SUM2(int A[], int n) { //线性递归,采取递归跟踪的策略 return //也可以采取递归方程 (n < 1) ? 0 : SUM2(int A[], int n - 1) + A[n - 1]; } //T( ) = O(1) * (N+1) = O(n) 数组倒置递归版本 void reverse(int* A, int lo, int hi) { //数组倒置递归版本 if (lo < hi) { swap(A[lo], A[hi]); return reverse( A, int lo + 1, int hi - 1); } else return; // 这个就是递归基啊,lo >= hi 都不行的。 } 分而治之版数组求和 int SUM(int A[], int lo, int hi) { //分治版数组求和 if (lo == hi)return A[lo]; int mid = (lo + hi) >> 1; return SUM(A, lo,

数据结构与算法:链表

谁都会走 提交于 2020-02-26 10:29:37
一、链表和数组的区别 链表与数组相似,但链表是一种比数组稍微复杂的数据结构。数组需要一块连续的内存空间来存储数据,对内存的要求比较高,而链表则不需要,它通过「指针」将不连续的内存块串联起来。如果要申请一个 100MB 大小的数组和链表,当内存中没有连续的,或者没有足够大小的空间时,数组便会申请失败,而链表不会。 链表有很多种结构,常见的有: 单链表 、 双向链表 、 循环链表 。 二、单向链表 链表通过指针将不连续的内存块串联在一起使用,我们把其中的内存块称为「结点」,而为了将所有的结点串起来,链表中的结点除了存储数据之外,还会用指针记录链表结点的下一个结点的地址,我们把这个记录下一个结点的地址的指针叫做「后继指针next」,整个单链表如下图所示。 其中第一个结点和最后一个结点是比较特殊的,通常分别把它们称为「头结点」和「尾结点」。头结点用来记录链表的基地址,有了它就能遍历得到整个链表。尾结点并不指向任何结点,而是指向空地址 null ,表示链表上的最后一个结点。 与数组不同,链表的插入和删除操作并不需要大量的数据搬移,它只需要考虑相邻结点的指针改变,对应的时间复杂度为 O(1) 。同样,链表的访问元素操作也没有数组那样直接用首地址和下标通过寻址公式直接得到对应的内存地址,链表需要通过从指针一个一个结点地遍历,直到找到相应的结点。因此链表的随机访问时间复杂度为 O(n) 。 三

数据结构的基本概念

喜夏-厌秋 提交于 2020-02-26 08:15:27
数据结构 一、线性表 1. 顺序存储结构(顺序表) 一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同情况下不同。 2. 链表 链表里面节点的地址不是连续的,而是通过指针进行链接的。 二、哈希表 1. 哈希的导入 数组的特点是:寻址容易,插入和删除困难; 链表的特点是:寻址困难,插入和删除容易。 那么,我们综合两者的特性,做出一种寻址容易,插入和删除也容易的数据结构,这就是哈希表。 下面是哈希表的一种实现方法:拉链法。 在图的左边是一个数组,数组的每个成员包括一个指针,指向一个链表的头,根据元素的特征将元素分配到不同的链表中去,我们也是根据这些特征,找到正确的链表,再从链表中找到正确的元素。 2. 哈希表 哈希表就是把Key通过一个固定的算法函数——哈希函数,转换成一个整形数字,然后就将该数字对数长度进行取余,取余结果当作数组的下标,将value存储在以该数字为下表的数组空间里。 3. 哈希表的优缺点 优点 时间少:无论哈希表中的数据量,我们在操作时的插入,删除,查询都只需要O(1)的时间级。 速度快:在日常程序中,在特定时间内哈希表的查找速度总比树快。 编程简单:相对树来讲,哈希表编程实现相对简单。 缺点 哈希表基于数组,数组创建后难以扩展,故当哈希表被基本填满时,性能下降会非常严重,所以在创立哈希表时我们必须清楚表中将要存储多少数据。

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

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

数据结构之队列

こ雲淡風輕ζ 提交于 2020-02-26 06:22:14
文章来源: http://blog.seclibs.com/数据结构之队列/ 上一篇文章说了一种“功能受限”的顺序表——栈,现在再来说一个 “功能受限”的顺序表 —— 队列 (queue)。 队列也是一个常用的数据结构,在大部分资源有限的情况下,当没有空闲资源的时候,基本上都是使用队列这种数据结构来实现请求排队的。 队列,顾名思义,就是排的一条队,比如在买票的时候排的一条队伍,先来的先买,后来的后买,不允许插队,也就是先进先出的方式,栈是后进先出的方式。 栈支持入栈(push)和出栈(pop)两种操作,队列也是类似的,支持入队(enqueue)和出队(dequeue)两种操作,入队就是在尾部追加一个数据,出队就是在头部取走一个数据。 队列作为一种非常基础的数据结构,应用是非常广泛的,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。 队列在实现上跟栈也是类似的,可以使用数组或链表来进行实现,使用数组实现的叫做顺序队列,使用链表实现的叫做链式队列。但是栈只需要一个栈顶指针top就可以了,队列则需要头部head指针和尾部tail指针两个来标识。 比如说a、b、c、d四个数据入队以后,head指针将指向下标为0的位置,tail指针指向下标为4的位置 当进行两次出队的操作后,head指针将指向下标为2的位置

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

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

从例题看数据结构队列和栈

喜欢而已 提交于 2020-02-25 20:01:51
今天是周一,周末周六大了两天绿盟杯,被各种大佬暴虐,于是身为菜鸡的我就决定闭关,好了话不多说,今天记录下我看数据结构时的思考和转载的啊哈算法书一些知识。 首先,开篇是这样描述的:星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓 鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的 第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌 的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即 可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人 手中的牌全部出完时,游戏结束,对手获胜。 假如游戏开始时,小哼手中有 6张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6张牌,顺序 为 3 1 3 5 6 4,终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来 自动判断谁将获胜。这里我们做一个约定,小哼和小哈手中牌的牌面只有 1~9。 在这道题目中,我们首先考虑的事扑克牌的存放的问题,这可以用数组完成,接下来我们考虑桌面牌的存放,也是可以用数组表示,但是数组长度怎么设置呢,开小了,会导致越界问题;开大了,又会导致浪费;由于牌又有9张不同的,我们考虑设置成10,好吧这些貌似有点low,我们直接进一步分析,首先设置队列如下: struct

数据结构之数组

僤鯓⒐⒋嵵緔 提交于 2020-02-25 17:13:19
文章来源: http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e6%95%b0%e7%bb%84/ 在说数组之前咱们先明确两个概念,什么是 线性表 ,什么是 非线性表 顾名思义,线性表就是把数据排成一条,每个数据只有前后两种情况,常见的线性表有 数组、链表、队列、栈 等 那非线性表就更好理解了,数据不是按照一条线来排列的,每个数据并不只有前后两个方向,常见的有 二叉树、堆、图 等 明白了这个概念之后,咱们再来说数组,什么是数组? 数组不仅是大多数编程语言中的一个数据类型,它更是一个最基础的数据结构。 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 关于线性表前面已经说过了,接下来说具有连续的内存空间、存储相同类型的数据,也正是因为这一点才使数组有了 随机访问 的特性。 我们拿下面这个例子来进行说明,有一个长度为10的int类型的数组,我们给它分配一块连续内存空间 1000~1039,内存块的首地址为1000 当我们需要访问其中的数据的时候,计算机会先通过一个寻址公式来找到内存地址,然后再读取其中的数据。 在数组中我们使用的寻址公式为 a[i]_address = base_address + i * data_type_size base

数据结构与算法常见面试题1

烈酒焚心 提交于 2020-02-24 20:22:00
1.八大数据结构及其应用场景(数组、栈、链表、树、图、堆、散列表) 1.数组 数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。连续存储结构其实就是数组。 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 使用场景 数组在以下三个情形下很有用: 1)数据量较小。 2)数据规模已知。 3)随机访问,修改元素值。 如果插入速度很重要,选择无序数组。如果查找速度很重要,选择有序数组,并使用二分查找。 缺点 1)需要预先知道数据规模 2)插入效率低,因为需要移动大量元素。 2.栈 是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 使用场景 1.十进制与其它进制间的转换 125→1111111 2.行编辑器 #退格 @清除 3.平衡符号的判断 {[()()]} 4.中缀表达式转后缀表达式 顺序栈 优点 1)在输入数据量可预知的情形下,可以使用数组实现栈,并且数组实现的栈效率更高

数据结构与算法动态可视化!!!

六月ゝ 毕业季﹏ 提交于 2020-02-24 07:35:15
数据结构与算法是计算机专业的必修课,学好数据结构与算法对于每一个程序员都是十分重要的;数据结构对于程序员来说就相当于绝世内功心法对于江湖人士一样重要,学好数据结构甚至决定了以后发展的水平高度。可对于很多人来说,这玩意就是遭罪的,不仅无聊还费脑细胞;对于我这个菜鸟来说,毫无疑问也是个头痛的问题。 个人感觉学好数据结构与算法绝非一朝一夕之功,除了夜以继日的坚持奋斗,好的学习工具也应该充分利用起来,于是今天给大家分享一个学习数据结构与算法的动态可视化网站,个人感觉还是蛮不错的,大家可以借鉴学习。 网址: 数据结构与算法动态可视化网站 进入之后的界面如下图: 可以看到这里包括了数据结构的所有种类以及常见算法。 点击搜索框下拉列表可以选择自己想学习的数据结构和算法的可视化界面,如下图: 在这里给大家一个例子,比如我想看最小生成树,可以搜索“最小生成树关键字”,并选择它,如下图: 单击进入网页,如下图,当然如果你英文看着不习惯,也可以直接右键翻译成中文,如下图: 翻译成中文之后的网页(大概看懂就行,没必要咬文嚼字,那是文学家的事): 可以点击下拉框,则会弹出该数据结构的知识目录,如下图: 点击即可跳转至相应知识点,还可以点击PgDn、PgUp,向上向下翻页,若想自行学习,即可点击Esc,离开并进入探索模式,简单来说,这个模式对于学生来说就是自学模式(对于教师也可以作为辅助教学工具)