算法与数据结构

数据结构mooc陈越第一周总结

老子叫甜甜 提交于 2019-11-30 06:32:55
1.2 空间复杂度S(n) ——根据算法写成的程序在执行时 占用存储单元的长度。这个长度往往与输入数据的 规模有关。空间复杂度过高的算法可能导致使用的 内存超限,造成程序非正常中断。 时间复杂度T(n) ——根据算法写成的程序在执行时 耗费时间的长度。这个长度往往也与输入数据的规 模有关。时间复杂度过高的低效算法可能导致我们 在有生之年都等不到运行结果。 在分析一般算法的效率时,我们经常关注下面 两种复杂度 最坏情况复杂度 Tworst( n ) 平均复杂度 Tavg( n ) T(n) = O(f(n)) 表示存在常数C >0, n0>0 使得当 n>=n0 时有T(n) <= C·f(n) T(n) = Ω(g(n)) 表示存在常数C >0, n0>0 使得当 n>=n0 时有T(n) >= C·g(n) T(n) = Θ(h(n)) 表示同时有T(n) = O(h(n)) 和 T(n) = Ω(h(n)) 若两段算法分别有复杂度T1(n) = O(f1(n)) 和T2(n) = O(f2(n)),则 T1(n) + T2(n) = max( O(f1(n)), O(f2(n)) ) T1(n) x T2(n) = O( f1(n) x f2(n) ) 若T(n)是关于n的k阶多项式,那么T(n)=Θ(n^k) 一个for循环的时间复杂度等于循环次数乘以循环体 代码的复杂度

数据结构及算法基础学习笔记

风格不统一 提交于 2019-11-30 06:01:56
1.python数据结构及算法基础学习笔记思维导图 2.程序代码演示 1.链表模型:linklist.py 1 """ 2 功能: 实现单链表的构建和操作 3 4 """ 5 6 # 创建节点类 7 class Node: 8 """ 9 思路 : *自定义类视为节点类,类中的属性为数据内容 10 *写一个next属性,用来和下一个 节点建立关系 11 """ 12 def __init__(self,val,next = None): 13 """ 14 val: 有用数据 15 next: 下一个节点引用 16 """ 17 self.val = val 18 self.next = next 19 20 21 # 链式线性表操作类 22 class LinkList: 23 """ 24 思路 : 生成单链表,通过实例化的对象就代表一个链表 25 可以调用具体的操作方法完成各种功能 26 """ 27 def __init__(self): 28 # 链表的初始化节点,没有有用数据,但是便于标记链表的开端 29 self.head = Node(None) 30 31 # 初始化链表,添加一组节点 32 def init_list(self,list_): 33 p = self.head # p 作为移动变量 34 for i in list_: 35 #

学习笔记之数据结构基础知识点及个人理解

十年热恋 提交于 2019-11-30 05:49:42
1.数据结构 a)个人见解:姑且认为数据结构是数据间的联系、数据的组织形式,对数据的基本操作算法:增、删、查、改、排,以及研究算法的复杂度的研究。若有错误,日后再修正。 b)数据结构在描述数据间的联系时,则称为逻辑结构; 逻辑结构的类型: 非线性的有:集合; 树:不包括根结点和终端结点的其他结点,都有唯一的父结点和子结点; 图; 线性:不包括头结点和终端结点的其他结点,都有唯一的前驱和后继); 数据结构在表示数据在计算机存储组织形式时,则称为物理结构;如链表就是种物理结构。 物理结构(亦叫存储结构)的类型: 顺序存储结构:数据元素存储在地址连续的一段内存中,通过相对地址完成对数据元素的操作; 链式存储结构:数据元素在内存中的地址可能是连续的,也可能是不连续的,存储的数据包括数据域和指针域,通过指针实现对数据元素的操作; 索引存储结构:数据元素存储在地址不连续的内存中,并建立一个索引表来保存数据元素的地址; 散列存储结构:数据元素在内存中的地址是连续的,通过散列函数根据关键码来计算出哈希值;(尚未完全理解,待补充); 2.数据元素、数据项、数据对象三者的联系 假设一条单向链表,其结点存储的数据是学生的基本信息:姓名、学号、年级。 数据对象由数据元素组成,数据元素则由数据项组成。 “姓名”、“学号”、“年级”分别为数据项,由三个数据项组合而成的“姓名、学号、年级

C++——STL

守給你的承諾、 提交于 2019-11-30 05:48:56
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/lggbxf/article/details/90668253 C++——STL 六大组件 容器 算法 迭代器 仿函数 适配器 空间配置器 STL的三大组件 容器 算法 迭代器 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。 为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL 六大组件 STL提供了六大组件,彼此之间可以组合套用,分别是:容器、算法、迭代器、仿函数、适配器、空间配置器。 容器 各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template 算法 各种常用的算法,如sort、find

面试问题之数据结构与算法:递归的基本思想

核能气质少年 提交于 2019-11-30 04:33:25
递归是算法设计中的一种基本而重要的算法。递归方法通过函数调用自身将问题转化为本质相同但规模较小的子问题,是分治策略的具体体现。递规的基本思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。用递归思想写出的程序往往十分简洁易懂。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进。当边界条件满足时,递归返回。   使用递归要注意以下几点:   (1)递归就是在过程或函数里调用自身   (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 来源: https://www.cnblogs.com/yichengming/p/11560302.html

王道数据结构——线性表中顺序表的一些综合应用题

北战南征 提交于 2019-11-30 04:22:18
1.长度为n的顺序表中,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,用于删除线性表中所有值为x的数据元素。(满足要求的数放在第k位上) 1 #include <cstdio> 2 3 /*输出数组名为a、长度为n的数组*/ 4 void print(int *a, int n){ 5 for(int i = 0;i < n; i++){ 6 printf("%d ", a[i]); 7 } 8 puts(""); 9 } 10 11 /*解法1,第几个不等于x的数就应该在结果的第几个位置上,千万记得最后修改删除后的数组长度为k*/ 12 void f1(int *a, int n, int x){ 13 int k = 0; 14 for(int i = 0; i < n; i++){ 15 if(a[i] != x){ 16 a[k++] = a[i]; 17 } 18 } 19 n = k; 20 print(a,k); 21 } 22 23 /*解法2,用k记录等于x的个数,那么下一个不等于x的数在结果中的位置应该提前k个位置,最后数组的长度减去k*/ 24 void f2(int *a, int n, int x){ 25 int k = 0; 26 for(int i = 0; i < n; i++){ 27 if(a[i] == x) 28 k++; 29

数据结构与算法 - 栈和队列

那年仲夏 提交于 2019-11-30 02:53:11
栈(stack) 先进后出,删除与加入均在栈顶操作 栈也称为堆栈,是一种线性表。 堆栈的特性: 最先放入堆栈中的内容最后被拿出来,最后放入堆栈中的内容最先被拿出来, 被称为先进后出、后进先出。 堆栈中两个最重要的操作是PUSH和POP,两个是相反的操作。 PUSH:在堆栈的顶部加入一 个元素。 POP:在堆栈顶部移去一个元素, 并将堆栈的大小减一。 在成员变量方面,Vector提供了elementData , elementCount, capacityIncrement三个成员变量。其中        elementData :"Object[]类型的数组",它保存了Vector中的元素,可以随着元素的增加而动态的增长,如果在初始化Vector时没有指定容器大小,则使用默认大小为10. private static final int DEFAULT_SIZE = 10;初始化的值 protected int elementCount ; 栈元素数量(非空元素的长度) /** * 使用指定的初始容量和容量增量构造一个空的向量。 */ public Vector(int initialCapacity, int capacityIncrement) { //初始化 super(); if (initialCapacity < 0) throw new

数据结构与算法作业——第一章 概论 + 第二章 线性表

有些话、适合烂在心里 提交于 2019-11-30 00:46:51
重点题: 第一章:小测-2、4、7 第二章:小测-3 & 编程-2、3 第一章 概论 part 1: 小测验 答案: 1.C你选对了 解析: A、向量:直接访问型线性结构 B、散列表:目录索引型线性结构 C、图:无序 D、队列:是线性表按操作分类的一种(先入先出) 2.D你选对了 解析: A、数组:按索引值从小到大存放在一片相邻的连续区域,定义了存储结构 B、双链表:链式存储 C、顺序表:按索引值从小到大存放在一片相邻的连续区域,定义了存储结构 D、队列:可以是顺序或链式存储,是逻辑结构 3.A、C你选对了 解析: A、算法保证计算结果的正确性。 B、指令必须有限 C、算法不能含有死循环,必须在有限步骤内结束 D、算法具有确定性 4.B、D你选对了 解析: A、(4)当f(n)=n,g(n)=n*2, 无论a多大,g(n)都不可能是O(af(n)). B、(2) 如果f(n)是O(g(n)),g(n)是O(h(n)), 则f(n)是O(h(n)),所以f(n)+g(n)是O(h(n)) C、(3)logan=log(n)/log(a),logbn=log(n)/log(b),所以前者与后者只差了一个常数项,所以logbn一定是O(logan) D、(1) 根据O()定义可知. 5.A、B你选对了 解析: A、本代码实际上是求a中有序子数组中最长的长度。譬如,在[1, 8, 1, 2

数据结构的几个概念

我的梦境 提交于 2019-11-29 23:39:08
一、基本概念 数据 描述客观事物的数值、字符以及能输入计算机且能被处理的各种符号集合 ,即数据是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述 数据元素 组成数据的 基本单位 数据项 是数据不可分割的 最小单位 数据对象 性质相同 的数据元素的集合 数据类型 性质相同的值的集合,以及定义在这个值集合上的一组操作的总称 数据类型定义了两个集合,即该值类型的 取值范围 和该类型中可允许使用的一组 运算 目的:实现信息隐藏,将用户不必关心的细节封装 分类(“值”): 类别 可否分解 结构类型(成分可为非结构的,也可为结构的,如数组、结构体 由若干成分按某种结构组成。可分解 非结构的原子类型(C语言中的标准类型(整型、实型、字符型等)及指针 值不可分解 数据抽象与数据抽象类型 数据抽象类型(ADT) 转载博客 三种实现 传统的面向过程的程序设计 “包””模型"的设计方法 面向对象的程序设计 二、数据结构 数据结构的内容可归纳为三部分: 逻辑结构; 存储结构; 运算集合; 任何一个算法的 设计 取决于选定的数据( 逻辑 )结构,而算法的 实现 则依赖于采用的 存储 结构 数据结构 定义 相互之间存在一种或多种特定 关系 的数据元素的集合; 【注】 数据结构是一个 二元组 : Data_Structure = (D,R) 其中,D是指数据元素的有限集,R是D上关系的有限集 逻辑结构

[转载]数据结构

走远了吗. 提交于 2019-11-29 22:33:54
目录 一、什么是数据结构? 二、数据结构的分类 三、线性结构 (1)栈 (2)队列 (3)单链表 (4)双链表 (5)哈希表 一、什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 “程序=数据结构+算法” 二、数据结构的分类 数据结构按照其逻辑结构可分为线性结构、树结构、图结构 线性结构:数据结构中的元素存在一对一的相互关系 树结构 :数据结构中的元素存在一对多的相互关系 图结构:数据结构中的元素存在多对多的相互关系 下面就来说说线性结构,树结构见链接,图结构待续。。 三、线性结构 (1)栈 1、定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表。 2、栈的特点:后进先出(last-in,first-out),简称LIFO表 3、栈的概念: 栈顶:允许插入和删除的这一端称之为栈顶 栈底:另一固定的一端称为栈底 空栈:不含任何元素的栈称为空栈 4、栈的基本操作: 进栈(压栈):push 出栈:pop 取栈顶:gettop 如图: 5、栈的Python实现 不需要自己定义,使用列表结构即可。 进栈函数:append 出栈函数:pop 查看栈顶元素:li[-1] li = [] li.append(1)