算法与数据结构

数据结构与算法概述

依然范特西╮ 提交于 2020-01-18 04:36:23
一、基本概念和术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体进行处理。也被称为记录。 数据项:一个数据元素可以由多个数据项组成。数据项是数据不可分割的最小单位。 数据对象:是性质相同的数据元素的集合,是数据的子集。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 二、逻辑结构与物理结构 逻辑结构:是指数据对象中数据元素之间的相互关系。 物理结构:是指数据的逻辑结构在计算机中的存储形式。 数据结构中的“线性表”、“栈与队列”、“串”、“树”、“图”的逻辑结构结构都基于以下的四种形式构思,在计算机中的存储都是基于以下两种结构实现存储。 三、算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作 。 算法的特性: (1)输入输出 (2)有穷性(3)确定性 (4)可行性 算法效率的度量方法: (1)时间复杂度 1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。 2.

防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!

旧街凉风 提交于 2020-01-16 16:29:26
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图论的时候,中间实现的过程步骤开始剧增,那个时候靠写写画画和对程序的单步调试强行理解,作为一个智商一直被压制的惨人,稍不注意就会重新来过,陷入死循环… 后来搞 ACM 之初,我的队友给了我一个数据结构模拟器的压缩包(后来知道好像是严蔚敏数据机构那本书光盘里带的),里面是对一些数据结构的模拟操作,一步步的很形象,有些东西好像一下子就通了… 这种可视化的动画真的对我们理解数据结构和算法非常有帮助,尤其是在学习之初,堪称很好的防劝退工具,所以我对这些做了一些整理,希望能帮助到你。 0x00 数据结构在线模拟器 Github 网址:https://github.com/IACJ/react-datastructer 在线网址:https://iacj.github.io/react-datastructer/#/ 这个在线的模拟器包含“栈”、“队列”、“堆”、“BST” 等数据结构

数据结构与算法二最好、最坏、平均、均摊时间复杂度

本秂侑毒 提交于 2020-01-16 06:03:33
前言 知识让生活更具能量。希望我们在以后学习的路上携手同行。您的点赞、评论和打赏都是对我最大的鼓励。一个人能走多远要看与谁同行,希望能与优秀的您结交。 我们在上一章, 主要是介绍了一下时间复杂度的分析,接下来接着跟大家聊一下时间复杂度的知识点。 最好、最坏情况时间复杂度 我们可以尝试分析下面的代码 //n表示数据array的长度 int find ( int [ ] array , int n , int x ) { int i = 0 ; int pos = i ; for ( ; i < n ; ++ i ) { if ( array [ i ] = x ) { pos = i ; } } return pos ; } 这段代码的功能是:在一个无序是的数组中找出x所在的位置。如果没有找到,就返回-1。 我们可以用让一章的内容分析出,这段代码阶位最高的为for循环中的代码,代码复杂度为O(n)。 大家可以看出,这段代码的效率不是很高,我们是可以对代码的效率进行优化的。如果我们中途找到这x的值就可以直接退出for循环。 int find ( int [ ] array , int n , int x ) { int i = 0 ; int pos = i ; for ( ; i < n ; ++ i ) { if ( array [ i ] = x ) { pos = i ;

数据结构:线性结构之线性表

我们两清 提交于 2020-01-15 18:57:58
就算没有天分,只要你愿意每天花一点时间,做同样一件事情,不知不觉间,你就会走得很远。 什么是线性表? 线性表是n(n>= 0)个元素的有限序列。在表中,元素之间存在这线性的逻辑关系: (1)表中有且仅有一个开始结点; (2)有且仅有一个终端结点; (3)除开始结点外,表中的每一个结点均只有一个前驱结点; (4)除终端结点外,表中的每一个结点均只有一个后继结点; 根据他们之间的关系可以排成一个现线性序列,记作:(a1,a2,...,an) 例如:26个英文字母表(A,B,C,...,X,Y,Z)就是一个线性表 这里的ai(1<=i<=n)属于同一数据对象,具有相同的数据类型。线性表中的数据元素 个数n就是线性表的长度,称作表长,n=0时为空表。i则是数据元素ai的位序。 线性表的存储方式 线性表有两种存储方式:顺序存储和链式存储 (一)顺序表 顺序存储是在内存中用一块地址连续的存储空间按顺序存储线性表的各个数据元素。 采用顺序存储结构的性表称为顺序表,顺序表中逻辑上相邻的数据元素在物理存储位置上也是相邻的。 只要确定了存储线性表的起始位置,线性表中的任意一个数据都可随机存取: 第i个元素的地址为:Loc(ai) = Loc(a1) + size * (i - 1) 其中size是每个元素所占的空间大小。 C语言版的实现 #include <stdio.h> #include

王道考研数据结构笔记之算法分析

这一生的挚爱 提交于 2020-01-15 04:00:37
算法的基本概念 算法 是对特定问题求解步骤的一种描述,它是指令的有限序列。具有下列五个重要特性: 有穷性:一个算法必须在有限的步骤结束,每一步都有在又穷的时间内结束 确定性:相同的输入只能得到相同的输出 可行性:可以被执行的操作 输入:有零个或多个输入 输出:有一个或多个输出 一个好的算法应该达到一下目标: 正确性:能够正确解决问题 可读性:具有良好的可读性,帮助别人理解 健壮性:输入非法数据,能够正确处理 效率与低存储量需求:尽量少的时间和空间 算法效率的度量 1、时间复杂度 一个语句的 频度 是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为 T(n) 。时间复杂度主要分析T(n)的数量级。算法中基本运算(最深层循环内的语句)的频度记为 f(n) ,因此时间复杂度记为: T(n)=O(f(n)) 分析一个程序的时间复杂性时,有以下两条规则: a) 加法规则 T(n)=T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n))) b)乘法规则 T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n)) 常见的时间复杂度 O(1)<O(log(n))<O(n)<O(nlog(n))<O(n * n)<O(n * n * n) 2、空间复杂度 空间复杂度**S(n)*

数据结构学习笔记——第一章 基本概念

无人久伴 提交于 2020-01-15 01:59:01
数据结构学习笔记——第一章 基本概念 第一章 基本概念 1.1 什么是数据结构 1.1.1 关于数据组织 1.1.2 关于空间使用 1.1.3 关于算法效率 1.1.4 抽象数据类型 什么是数据结构? 抽象数据类型(Abstract Data Type) 1.2 什么是算法 1.2.1 算法的定义 1.2.2 什么是好的算法 1.2.3 复杂度的渐进表示 1.3 应用实例 第一章 基本概念 1.1 什么是数据结构 1.1.1 关于数据组织 1.1.2 关于空间使用 1.1.3 关于算法效率 1.1.4 抽象数据类型 什么是数据结构? 数据对象 在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的 操作 相关联 完成这些操作所用的方法就是 算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象 :描述数据类型的方法不依赖于具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言均无关 只描述数据对象集和相关操作集“ 是什么 ”,并不涉及“ 如何做到 ”的问题 1.2 什么是算法 1.2.1 算法的定义 算法(Algorithm) 一个有限指令集 接受一些输入(有些情况下不需要输入) 产生输出 一定在有限步骤之后终止 每一条指令必须 有充分明确的目标,不可以有歧义

山东大学《数据结构》实验二:排序算法

China☆狼群 提交于 2020-01-14 22:00:11
实验二 排序算法 一、实验目的 掌握各种排序方法的实现思想。 二、 实验内容 1、输入 2-20 个不为零的正整数,遇到 0 代表输入结束,0 不参与排序。 2、数字选择排序方法,1-冒泡排序,2-插入排序,3-基数排序 3、基数排序能够仅仅实现小于 10 的正整数的排序。有大于 9 的输入时, 直接输出 0。 4、使用所选排序方法的排序,结果输出所用方法以及结果,每个数之间 用“,”隔开,中间不要有空格。 5、输入输出请严格按下面要求的格式实现,不能少任何一行文字。 代码如下: # include <iostream> # include <cstdio> # include <stdlib.h> # include <string.h> using namespace std ; void swap ( int & a , int & b ) { int t = a ; a = b ; b = t ; } void bubble ( int a [ ] , int n ) { //冒泡排序方法 for ( int i = 0 ; i < n - 1 ; i ++ ) { for ( int j = 0 ; j < n - i - 1 ; j ++ ) { if ( a [ j ] > a [ j + 1 ] ) swap ( a [ j ] , a [ j + 1 ] ) ;

小甲鱼数据结构学习笔记——绪论

跟風遠走 提交于 2020-01-14 14:13:28
绪论 程序设计=数据结构+算法 数据结构就是数据元素相互间一种或多种关系的集合。 逻辑结构和物理结构 传统上,我们把数据结构分为逻辑结构和物理结构,主要研究逻辑结构,而物理结构是次要的。 逻辑结构:指数据对象中数据元素之间的相互关系。 物理结构:指数据的逻辑结构在计算机中的存储形式。 四大逻辑结构 集合结构:集合结构中数据元素之间的相互关系。 线性结构:线性结构中的数据元素之间是一对一的关系,有点像人体蜈蚣。。 树形结构:数据元素之间存在一种一对多的层次关系。 图形结构:数据元素是多对多的关系。按小甲鱼的说法就是杂交,emmmm(疑惑.jpg) 物理结构 研究物理结构就是研究如何把数据元素存储到计算机的存储器中。存储器主要针对内存而言,通常用文件结构来描述。 两种存储形式:顺序存储和链式存储 顺序存储结构:把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。(不常用)例如数组结构。 链式存储结构:把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 显然链式结构的数据元素存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样来通过地址找到相关联数据元素的位置。 算法时间复杂度 定义 :在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级

算法与数据结构 (五) 排序 二 插入排序 希尔排序 选择排序 归并排序

假装没事ソ 提交于 2020-01-14 06:33:27
一 插入排序和希尔排序 插入排序和冒泡排序有点像,一个形象的比喻就是打扑克的时候摸牌的时候,也就是手里的牌都是有序的,新插入的找位置,其它元素一次后移 package sort; import java.util.Arrays; public class ChaRu { public static void main(String[] args) { int arr[] = {2, 25, -5, 36, 89, -6}; chaRu(arr); System.out.println(Arrays.toString(arr)); } public static void chaRu(int []arr) { for(int i=1;i<arr.length;i++){ int j = i-1; int temp = arr[j + 1]; //while语句里可以不用实现交换 二是单向赋值 给要插的腾位置 while(j>=0){ if(temp<arr[j]){ arr[j + 1] = arr[j]; j--; }else{ break; } } arr[j + 1] = temp; } } public static void swap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j]

元素查找(数据结构与算法)(python)

别等时光非礼了梦想. 提交于 2020-01-13 07:19:04
创建列表aList中的元素,移除每个元素的空格,增加一个元素’python’, 并找出以’A’或者’a’开头,并以’c’结尾的所有元素,并添加到一个新列表中,最后循环打印这个新列表,用两种方法删除一个元素,转化为元组。 aList = ['taibai ','alexC','AbC ','egon',' Ritian',' Wusir',' aqc'] alist = ['taibai','alexC','AbC','egon','Ritian','Wusir',' aqc'] alist.append('python') print(alist) list1=[] list2=[] for i in alist: new_li = i.strip() list2.append(new_li) if (new_li.startswith('a') or new_li.startswith('A')) and new_li.endswith('c'): print(new_li) list1.append(new_li) print(list1) print(3*list1) del list2[2] print(list2) list2.pop(1) print(list2) alist_tuple=tuple(list2) print(alist_tuple) 来源: CSDN