算法与数据结构

北京大学公开课《数据结构与算法Python版》

不羁的心 提交于 2020-04-06 18:48:09
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版。 看了一些公开课后,今天特向大家推荐北京大学的这门课程:《数据结构与算法Python版》。 课程概述 很多同学想要转行机器学习,也确实掌握了一些机器学习模型原理并具备基础的编程功底,但是在笔试、面试的时候还会掉链子,大概率是数据结构和算法知识薄弱。数据结构和算法是程序员的内功心法和基本功。无论是人工智能还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少! 北京大学公开课《数据结构与算法Python版》,面向具有Python语言程序设计基础的大学生和社会公众,介绍常见的基本数据结构以及相关经典算法,强调问题-数据-算法的抽象过程,关注数据结构与算法的时间空间效率,培养学生编写出高效程序,从而解决实际问题的综合能力。 这门课程在中国大学MOOC正在进行第二次开课,已进行至第五周,心急的同学也可以直接看第一次开课的完整版,变化不大。 慕课: http://www.icourse163.org/course/0809PKU068-1206307812 B站: https://www.bilibili.com/video/BV1h7411m7BK/ 去B站围观陈斌老师 本课程主讲是陈斌老师,陈老师是北京大学地球与空间科学学院教师,博士,副教授,硕士生导师。主讲本科生课程《数据结构与算法

【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)

◇◆丶佛笑我妖孽 提交于 2020-04-06 13:00:27
最小路径和 LeetCode: 最小路径和 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。 思想: 动态规划,可以用原数组作为dp数组 代码: class Solution { public int minPathSum(int[][] grid) { int i=0,j=0; for(i=0;i<grid.length;++i){ for(j=0;j<grid[0].length;++j){ if(i>0&&j>0){ grid[i][j]+= Math.min(grid[i-1][j],grid[i][j-1]); }else{ grid[i][j]+= (i==0?0:grid[i-1][j]) + (j==0?0:grid[i][j-1]); } } } return grid[i-1][j-1]; } } 三角形最小路径和 LeetCode: 三角形最小路径和 题目描述: 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题

数据结构概述

≡放荡痞女 提交于 2020-04-06 10:36:34
数据结构 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 常用结构 数组: 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 栈: 是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 队列: 一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。 链表: 是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成

数据结构和算法(面试)

馋奶兔 提交于 2020-04-06 04:28:30
排序算法 直接插入排序 :将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过 希尔排序 :将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序 简单选择排序 :比较+交换 堆排序 :构建大顶堆进行排序 如何手写一个堆 1. 插入一个数 heap[ ++ size ] = x; up(size); 2. 邱集合当中的最小值 heap[1] 3. 删除最小值 heap[1] = heap[size]; size --; down(1); 4. 删除任意一个元素 heap[k] = heap[size]; size --; down(k); up(k); 5. 修改任意一个元素 heap[k] = x; down(k); up(k); 堆排序 int n, m; int h[ 1000 ], cnt; void down( int u ) { int t = u; if( u * 2 <= cnt && h[ u * 2 ] < h[ t ] ) t = u * 2; if( u * 2 + 1 <= cnt && h[ u * 2 + 1 ] < h[ t ] ) t = u * 2 + 1; if( u != t ) {

我说我不会排序算法,阿里就挂了我

女生的网名这么多〃 提交于 2020-04-05 22:40:05
前言 工作已经有一段时间了,有的时候会跟同事们打趣:“ 如果你让我现在去手写一个快速排序,我怕是真的写不出来 ”。 如果不接触一段时间的算法,真的很容易就忘了。不信?你现在想想你自己能不能手写一个堆排序。 经历过校招的人都知道, 算法和数据结构 都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以 排序 和各种的 基本数据结构 开始入门。我花了一个星期将 八大基础排序 和 链表/二叉树/栈/队列 制作成一份 精美的PDF 。 这份PDF阅读体验肯定是要比公众号和各大的博客平台的文章要好的。PDF内容 纯手打 ,有不懂的可以来问我。 下面来简单介绍一下八大基础排序和基础的数据结构,每种排序的思想和基础的 讲解和源码 在PDF里边有。 冒泡排序 思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要 n-1 趟排序(比如10个数,需要9趟排序) 代码实现要点: 两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数 。 每趟过后,比较的次数都应该要减1 选择排序

前端-数据结构和算法(一)

别等时光非礼了梦想. 提交于 2020-04-05 16:37:53
1.基础实用基础的数据结构详情 数据结构(data structure [ˈstrʌktʃə(r)] )是计算机存储、组织数据的方式; 算法(algorithm [ˈælɡərɪðəm] )是解决问题的方法/步骤和策略; 数据结构Array js中的数组结构非常简单(浏览器帮助我们进行封装处理好的) 可以存储不同的数据类型值 数组容量伴随存储内容自动缩放 Array.prototype上提供数组的操作方法 优势 :基于索引直接进行查找和获取,效率很高; 弊端 :进行中间插入和删除时,性能非常低( 数组坍塌 和 删除中间项的优化) 栈结构Stack 先进后出; 只能在一段操作:包括添加(进栈)和删除(出栈); 递归算法中的无限递归会出现栈溢出。 栈方法: class Stack { container = []; // 进栈 enter(element) { this.container.unshift(element); } // 出栈 leave() { return this.container.shift(); } // 栈的长度 size() { return this.container.length; } // 获取栈中的结果 value() { return this.container.slice(0); } } let sk = new Stack; 面试一:

一文讲透数据结构中的树,建议收藏!

跟風遠走 提交于 2020-04-04 10:32:16
数据结构是 10 年前大学里学的一门课程,也是我北漂唯一携带的一本书。幸运的是,书还没有被孩子给撕碎。 为了让大家都能够搞懂「树」这个苦涩而硬核的知识,今天就重拾记忆,分享一下研发人员心中那些放不下的「树」。 不过,一定要冲好咖啡、沏壶好茶,心平气和去看文。 01. 「树」现实与虚拟的抽象 在「中华姓氏树」中寻找一片属于你的叶子,探寻一下家族的来源。 在脑海里尝试画一下「家谱树」。 看完现实中的树,那来看一看计算机的文件系统组织形式。 无论是现实的姓氏树、家谱树,还是计算机的文件系统,表现形式虽然不同,但是本质上却都是树。 那到底什么是树呢? 树是由 n(n≥0)个结点组成的有限集合。 当 n = 0 时,称为空树; 当 n > 0 时,有一个特殊的节点称为根结点(root),它没有前驱结点;其它结点分为 m 棵互不相交的子树。 如图示意,(a)为空树;(b)为 1 个结点的树;(c)为 n 个结点的树。 知道了什么是树,上面「家谱树」以及「文件系统」用到的树表示法,有没有学名呢?稍微科普一下。 图示法:是树的直观表示法,主要用于描述树的逻辑结构,如上面提到的家谱树。 横向凹入表示法:是用逐层缩进方法表示结点之间的层次关系,主要用于树的屏幕显示和打印输出,如上面提到的文件系统。 知道了什么树以及树的部分表示法,但是猿有猿声,鸟有鸟语,树也有术语。 02.「树」有术语 节点 or

数据结构——树与二叉树

和自甴很熟 提交于 2020-03-29 19:01:14
目录 导言 什么是树 树结构定义 树的结点 结点分类 结点的联系 结点的层次 有序树 森林 相比线性结构 树的存储结构 双亲表示法 结构体定义 描述法举例 孩子表示法 描述法举例 结构体定义 孩子兄弟表示法 描述法举例 二叉树 二叉树的定义 特殊的二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 结构体定义 二叉树的基本操作 二叉树的遍历 从斐波那契数列说起 遍历算法 建立二叉树 拓展二叉树 建树算法 复制二叉树 获取二叉树的深度 统计二叉树的结点数 线索二叉树 描述前驱与后继 线索二叉树结点结构体定义 线索化 遍历线索二叉树 参考资料 导言 轩辕剑是一个经典的中文角色扮演游戏,通过对历史内容的考究,与精彩感人的剧情结合,使得这个系列被公认为华人世界的两大经典角色扮演游戏系列之一。我最为喜欢的两部是《轩辕剑叁:云和山的彼端》和《轩辕剑叁外传:天之痕》,剧情感人精彩、别有深意,2D的场景细致美观、独具特色……当然,我这次仍然不是来给你推荐游戏的,而是想对其中一个场景做点文章。 “建木”是上古先民崇拜的一种圣树,传说建木是沟通天地人神的桥梁,在《轩辕剑叁外传:天之痕》中的仙山岛,利用水墨画的风格进行了描绘,是我最喜欢的游戏场景之一。其中就有对“海中建木”的描绘。“海中建木”无疑是一颗巨大的树,这棵树也肯定是由无数的根、枝、叶组成的,如果我们把

数据结构,算法及线性表总结

て烟熏妆下的殇ゞ 提交于 2020-03-28 20:44:20
1.思维导图 2.重要概念笔记 1.数据结构 1.数据结构定义 -我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对元素进行排序等)而执行的相应操作,这个相应的操作也叫算法。 2.算法 -衡量算法的标准: -时间复杂度:程序大概要执行的次数,而非执行的时间 -空间复杂度:程序执行过程中大概所占用的最大内存空间 -难易程度:用易懂,避免过于复杂 -健壮性 3.连续存储【数组】 -什么叫数组:元素类型相同,大小相等 -数组的优缺点 --优点:存取速度很快 --缺点:插入删除元素很慢 4.离散结构【链表】 -定义:n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点同时每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点 -专业术语 --首节点:存放第一个有效数据的节点 --尾节点:存放最后一个有效数据的节点 --头结点:位于首节点之前的一个节点,头结点并不存放有效的数据,加头结点的目的主要是为了方便对链表的操作 --头指针:指向头结点的指针变量 --尾指针:指向尾节点的指针变量 -确定一个链表需要几个参数:只需要一个头指针参数,因为我们通过头指针可以推算出链表的其他所有信息 -分类: --单链表:每一个节点只有一个指针域 --双链表:每一个节点有两个指针域 -

数据结构-概念总结

大城市里の小女人 提交于 2020-03-28 19:14:48
数据结构概念总结 Data Structures + Algorithms = Programs 一.数据结构 1.基本概念: 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 2.数据结构的逻辑结构分为四种: 集合结构,线性结构,树形结构,图结构。 3.数据结构的物理结构分为两种: 顺序存储结构和链式存储结构. 4.学习数据结构的用途: 数据结构在计算机专业课程体系中起到承上启下的作业,熟练使用数据结构可以使程序运行的更快更流畅 思维导图: 二.算法 1.定义: 对特定问题求解步骤的一种描述,它是指令的特定序列,每一条指令表示一个或多个操作 2.特性: 有穷性,确定性,可行性,输入,输出。 3.算法的描述: 自然语言,流程图,程序设计语言,伪代码。 4.算法分析: (1)算法设计的目标: 正确性,可使用性,可读性,健壮性,时间效率高与存储量低 (2)两种衡量算法效率的方法: 事后统计法(把程序跑一遍): 必须执行程序,且存在其他因素掩盖算法本质 事前估计法(撇开软硬件相关因素,仅考虑算法本身效率): 算法执行时间=基本运算时间*运算次数 基本运算:被视为算术运算的一般是最深层循环内语句 (3)算法效率分析: 算法的执行时间可由其基本运算的执行次数来计算 时间复杂度:记号"O",表示随问题规模n增大,算法执行时间的增长率和f(n