算法与数据结构

python数据结构与算法基础名词积累

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-12 01:47:23
记录: 算法,很早之前,我就知道是特别重要一环;但是,今天,看到一个简单例子,第一次被震撼了。 算法: 算法是独立存在的一种解决问题的方法和思想。 算法五大特性: 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性:算法中的每一步都有确定的含义,不会出现二义性 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 大O记法: 对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数(忽略常数),记为f(n)=O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。 时间复杂度: 假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)。 时间复杂度排序: 最优时间复杂度: 算法完成工作最少需要多少基本操作。 最坏时间复杂度: 算法完成工作最多需要多少基本操作。 平均时间复杂度: 算法完成工作平均需要多少基本操作。 时间复杂度的几条基本计算规则: 1.基本操作,即只有常数项,认为其时间复杂度为O(1)。 2.顺序结构

【数据结构与算法之美】二叉树基础(上):什么样的二叉树适合用数组来存储?

心已入冬 提交于 2020-03-11 03:22:47
一、树 1.树的常用概念 根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。 2.概念解释 节点:树中的每个元素称为节点 父子关系:相邻两节点的连线,称为父子关系 根节点:没有父节点的节点 叶子节点:没有子节点的节点 父节点:指向子节点的节点 子节点:被父节点指向的节点 兄弟节点:具有相同父节点的多个节点称为兄弟节点关系 节点的高度:节点到叶子节点的最长路径所包含的边数 节点的深度:根节点到节点的路径所包含的边数 节点的层数:节点的深度+1(根节点的层数是1) 树的高度:等于根节点的高度 二、二叉树 1.概念 ①什么是二叉树? 每个节点最多只有2个子节点的树,这两个节点分别是左子节点和右子节点。 ②什么是满二叉树? 有一种二叉树,除了叶子节点外,每个节点都有左右两个子节点,这种二叉树叫做满二叉树。 ③什么是完全二叉树? 叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树 2.完全二叉树的存储 ①链式存储 每个节点由3个字段,其中一个存储数据,另外两个是指向左右子节点的指针。我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来。这种存储方式比较常用,大部分二叉树代码都是通过这种方式实现的。 ②顺序存储 用数组来存储,对于完全二叉树,如果节点X存储在数组中的下标为i

数据结构与算法_1.稀疏数组和队列_2

孤街醉人 提交于 2020-03-11 01:54:18
1.2 队列 单链表 链表为有序列表,在内存中的存储如下: 链表是以节点的方式来存储,是链式存储。 每个节点包含:data 域和 next 域(指向下一个节点)。 链表的各个节点不一定是连续存储的。 链表分有头节点的链表和没有头节点的链表,根据实际的需求来确定。 代码实现 : /* 1. 第一种方法:添加节点时,直接添加到链表尾部 */ public class Demo01SingleLinkedList { public static void main ( String [ ] args ) { // 创建节点 HeroNode hero1 = new HeroNode ( 1 , "宋江" , "及时雨" ) ; HeroNode hero2 = new HeroNode ( 2 , "卢俊义" , "玉麒麟" ) ; HeroNode hero3 = new HeroNode ( 3 , "吴用" , "智多星" ) ; HeroNode hero4 = new HeroNode ( 4 , "林冲" , "豹子头" ) ; // 创建链表 SingleLinkedList singleLinkedList = new SingleLinkedList ( ) ; // 加入节点 singleLinkedList . add ( hero1 ) ;

数据结构

自闭症网瘾萝莉.ら 提交于 2020-03-10 22:16:20
数据结构学习 数据结构简介 线性结构 树 图 散列查找 排序 数据结构简介 维基百科:数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最有效率的算法。 数据结构:涵盖(1)数据对象(2)其组织方式[逻辑存储、物理存储](3)操作集(4)实现操作的最高效算法 解决问题的效率与数据的组织方式有关,跟空间利用效率有关,也与算法的巧妙程度有关。 “数据结构”包括数据对象集以及它们在计算机中的组织方式,即它们的逻辑结构和物理存储结构,同时还包括与数据对象集相关联的操作集,以及实现这些操作的最高效的算法。抽象数据类型是用来描述数据结构的重要工具。 “算法”是解决问题步骤的有限集合,通常用某一种计算机语言进行伪码描述。我们用时间复杂度和空间复杂度来衡量算法的优劣,用渐进表示法分析算法复杂度的增长趋势。 线性结构 数据的组织方式:(1)逻辑结构:线性、树、图 (2)物理存储结构:数组、链表 线性表 :是由同一类型的数据元素构成的有序序列的线性结构 线性表:顺序存储实现;链式存储实现 广义表:是线性表的推广,元素不仅可以是单元素也可以是另一个广义表;多重链表:存在结点属于多个链的链表,指针域会有多个(双向链表不是多重链表)。 堆栈 :具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶的端点位置。 队列 :具有一定操作约束的线性表,只能在一端插入,而在另一端删除。

算法 玩转数据结构 1-3 关于课程学习的更多注意事项(王婆卖瓜)

廉价感情. 提交于 2020-03-10 07:55:36
1    作者不同的课程重点比对 2    脚本语言执行注意事项 3    课程代码库 1    作者不同的课程重点比对 1.1  本课程与《算法和数据结构》的对比 a  内容方面 本课程更加关注数据结构的底层实现,包含数据结构更多。 算法与数据结构,包含的数据结构少(标黑部分)。 算法与数据结构课程还包括: 各种排序算法的比较: 选择排序;插入排序;归并排序(自底向上,自顶向下);快速排序(单路,双路,三路); 堆排序;图算法:连通性,寻路,Prim;Kruskal;无向图最短路径;Dijkstra,Bellman-Ford b  使用语言方面 本课程使用java语言,而《算法和数据结构》使用c++讲解。 1.2  本课程与《玩转算法面试》的对比 后者主要讲的算法设计领域相关的问题,后者主要面对面试相关。 2    脚本语言执行注意事项 脚本语言不适用于考察数据结构和性能,因为写出的逻辑的性能不仅仅取决于编写的逻辑,还依赖于脚本的解析器对不同的写法的解析不同。 如:python中,b的写法要优于a的写法,执行效率更高 a: arr=0 for iin range(10): arr. append(i) b: arr=[i for iin range(10)] 3    课程代码库 https://github.com/liuyubobobo/Play-with-Data

【Java数据结构+算法】递归-----八皇后问题(分析与实现)

陌路散爱 提交于 2020-03-10 07:53:52
一、八皇后问题描述 八皇后问题,是一一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出 : 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, 即:任意两个皇后都不能处于同一行、同一-列或同-斜线上 ,问有多少种摆法。 二、八皇后问题思路分析 (使用到回溯算法) (1)、第一个皇后先放第一行第- -列 (2)、第二个皇后放在第二行第一列、然后判断是否0K,如果不0K, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适的位置 (3)、继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。 (4)、当得到一个正确解时,在栈回退到上一一个栈时,就会开始回溯,即将第一个皇后,放到第一-列的所有正确解,全部得到。 (5)、然后回头继续第一个皇后放第二列,后面继续循环执行1,2,3的步骤。 说明:本来应该创建一-个二维数组来表示棋盘,但是实际上可以通过算法,用一个 一维数组 即可解决问题。 比如:arr = {0,4,7,5,2,6,1,3}: ①数组下标+1:表示行的位置 ②数组元素+1:表示列的位置 比如0:第一行第一列 4:第二行第五列 三、代码实现 package com . ycx . recursion ; import java . util . Queue ; public

算法与数据结构实验题6.4 order (二叉树)

喜夏-厌秋 提交于 2020-03-09 20:28:26
1、题目: 2、代码: #include<iostream> #include<algorithm> using namespace std; struct Node { int left; int right; int father; int ord; } node[100010]; void preOrder(int m) { if(m!=-1) { cout<<m<<" "; preOrder(node[m].left); preOrder(node[m].right); } } void posOrder(int m) { if(m!=-1) { posOrder(node[m].left); posOrder(node[m].right); cout<<m<<" "; } } int main() { int n; cin>>n; int i; for(i=1; i<=n; i++) { cin>>node[i].father; } for(i=1; i<=n; i++) { int x; cin>>x; node[x].ord=i; } for(i=1; i<=n; i++) { node[i].left=-1; node[i].right=-1; } //为每个结点设置儿子 for(i=1; i<=n; i++) { if(node[node[i].father]

C++从入门开始讲算法(1)

China☆狼群 提交于 2020-03-09 12:12:57
以下内容来自于洛谷网站 本文章仅是讲一个目录,细节会在之后的文章中出现 大家请拿起手中的纸和笔,认真做笔记! 文章目录 1.顺序结构 2.分支结构 3.循环结构 4.数组 5.字符串 6.函数与结构体 7.排序 8.高精度算法与模拟 9暴力枚举 10 递归递推 11.贪心 12.二分 13。搜索 14.线性表 15.二叉树 16.集合 17.图的基本应用 1.顺序结构 千里之行,始于足下。程序设计虽然花样繁多,但还是要从最简单的地方开始学习,由浅入深,直至掌握。毕竟任何复杂的工程代码都是由一行行简单的代码组成的。 我们编写计算机程序,将一个任务分解成一条一条的语句,计算机会按照顺序一条一条的执行这些语句,这就是顺序结构程序设计。 2.分支结构 人们在人生中需要做出许多选择,小到考虑晚上吃什么,大到决定高考志愿填报的学校。只有一次次选择后才能带来无限可能,我们要根据自己掌握的情况,做出最佳的选择。 程序的执行也不是一成不变的,往往会要求程序能够在不同的场合下有不同的动作。这时就需要在代码中使用条件语句来做出不同的选择。比如说,登录洛谷网时,网站后台会将你提交的用户名和密码在后台数据库中看看是否匹配,如果能够匹配就登陆成功,否则就登陆失败。这一章就来介绍如何让程序做出选择。 3.循环结构 虽然计算机可以在短时间批量处理成千上万条指令,但是不少问题中有许多规律性的重复操作

栈与堆的区别

我们两清 提交于 2020-03-08 14:32:27
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 栈使用的是 一级缓存 , 他们通常都是被调用时处于存储空间中,调用完毕立即释放 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 堆则是存放在 二级缓存 中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些 堆(数据结构):堆可以被看成是一棵树,如:堆排序 栈(数据结构):一种后进先出的的数据结构 来源: https://www.cnblogs.com/carry-/p/6671770.html

数据结构与算法系列十(排序算法概述)

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