算法与数据结构

算法的窥探

那年仲夏 提交于 2020-03-01 03:41:39
计算机语言能对计算的控制是有限的, 最大程度的交互就是游戏, 而计算机对问题的求解是无限度的.本篇是对计算机数据结构以及算法的使用做一些探索. 本篇探讨的是: 什么是数据结构? 为什么需要数据结构 ? 为什么使用算法? 怎样掌握他们? 在探索之前, 先要提到的是数学建模. 一个苹果从空中落下来, 它的运动情况是符合这个公式的. H= 1/2g t^2 你可以依据这个模型, 知道不同T情况下的H , 对这个现实问题的情况进行更好的预测和处理. 这个过程, 就是对现实问题的求解, 是数学建模. 编程也是对现实问题的求解. 而数据结构与算法是在计算机领域的建模. 程序建模一般符合这样的三个过程. 1. 数据结构 最基本的数据结构, 其实是变量, 我们通常编程用到的最简单的数据结构, 基于变量之上的编程, 是最初级的编程. 使用了复杂一点数据结构, 并在其上编程, 取决于面对的问题. 通常情况下 , 使用的数据结构越复杂, 其编程能力越强, 对去现实问题的求解越强 选择合适的数据结构, 应当考虑所选择结构的排列规则, 以及利用该的运算特性 2. 算法 算法是问题求解的一个子模块, 又是一个庞大的体系, 初学使用, 应每一个数据结构下着重掌握其中一个算法, (例如线性结构, 就掌握快速排序; 图形结构, 掌握最短路径) 将精力集中于, 使用而不是在算法的理论的掌握上, 理论的掌握需要日积月.

数据结构—排序

谁说我不能喝 提交于 2020-03-01 02:54:30
排序:假设含有 n 个记录的序列为 ,其相应的关键字分别为 ,需确定 的一种排列 ,使其相应的关键字满足 ( 非递减或非递增 )关系,即使得序列成为 一个按关键字有序的序列 ,这样的操作就称为 排序 。 相信大家都有着极其丰富的网上购物的经验,现在网上购物已经非常成熟,对用户来说带来了很大的方便。 假如我想买一台 iPhone4 的手机,于是上了某电子商务网站去搜索。可搜索后发现(如下图所示),有 8863 个相关的物品,如此之多,这叫我如何选择。我其实是想买便宜一点的,但是又怕遇到骗子,想找信誉好的商家,如何做? 下面的有些购物达人给我出主意了,排序呀。对呀,排序就行了(如下图所示)。我完全可以根据自己的需要对搜索到的商品进行排序,比如按信用从高到低、再按价格从低到高,将最符合我预期的商品列在前面,最终找到我愿意购买的商家,非常的方便。 网站是如何做到快速地将商品按某种规则有序的呢?—— 排序 。 1. 排序的基本概念与分类 排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等。那排序的严格定义是什么呢? 假设含有 n 个记录的序列为 ,其相应的关键字分别为 ,需确定 1,2,…… ,n 的一种排列 ,使其相应的关键字满足 ( 非递减或非递增 )关系

PYTHON数据结构与算法学习笔记(四)

半腔热情 提交于 2020-03-01 02:31:48
目录 栈 栈结构实现 队列 队列的实现 双端队列 双端队列的实现 栈 栈(stack),也称堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。 由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。 栈结构实现 栈可以用顺序表实现,也可以用链表实现。 栈的操作 Stack() 创建一个新的空栈; push(item) 添加一个新的元素item到栈顶; pop() 弹出栈顶元素; peek() 返回栈顶元素; is_empty() 判断栈是否为空; size() 返回栈的元素个数。 这里使用顺序表(即python中的list)举例 class Stack ( object ) : def __init__ ( self ) : self . items = [ ] 1、 push(item) 添加一个新的元素item到栈顶 def push ( self , item ) : self . items . append ( item ) 2、 pop() 弹出栈顶元素 def pop (

数据结构(一)

浪尽此生 提交于 2020-02-29 22:14:10
数据结构是什么? 数据结构使指数据之间的关系,包含有逻辑结构和存储结构。 逻辑结构分为线性(一对一),树状(一对多),图状(多对多),集合(无明显对应) 存储要正确反应逻辑 常见的存储类型有vector,list,deque等等 数据结构初入门(排序算法) 推荐几个排序总结博客 各种排序算法总结 排序算法总结——时间复杂度与稳定性 关于排序稳定性的定义 通俗地讲就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。 1.冒泡排序 先码上代码 # include <iostream> # include <cstdio> # include <cmath> # include <ctime> # include <time.h> # include <algorithm> # include <cstring> using namespace std ; void BubbleSort ( int arr [ ] , int length ) { clock_t start , end ; start = clock ( ) ; for ( int i = 0 ; i < length ; i ++ ) { for ( int j = 0 ; j < length -

紫薇星上的数据结构(10)

怎甘沉沦 提交于 2020-02-29 16:46:53
终于来到最后一部分了,算法,这篇文章的出现也意味着这个系列就结束了,向着最后的胜利冲冲冲! 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 这一部分我们要整理的算法一般都是前人已经完善好的,大家如果不能理解其原理,那就学会如何使用就可以了。 简单来说算法就是解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令都表示一个或者多个操作。这里要注意:同一个问题可能有多种不同的解决算法;没有一个通用算法可以解决所有问题。 一个算法应该具有以下 五个重要的特征 : 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性(Definiteness):算法的每一步骤必须有确切的定义; 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性

数据结构与算法作业——合并两个有序数组

安稳与你 提交于 2020-02-29 14:14:15
题目:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 解题算法: class Solution { public : void merge ( vector < int > & nums1 , int m , vector < int > & nums2 , int n ) { int a = m - 1 ; int b = n - 1 ; int l = m + n - 1 ; while ( a >= 0 && b >= 0 ) nums1 [ l -- ] = nums1 [ a ] > nums2 [ b ] ? nums1 [ a -- ] : nums2 [ b -- ] ; while ( b >= 0 ) nums1 [ l -- ] = nums2 [ b -- ] ; //nums2内剩下的元素有序排在新数组的最前面 } } ; 来源: CSDN 作者: SuperF? 链接: https://blog.csdn.net/weixin_46338672/article/details/104571592

数据结构与算法-编写实例

末鹿安然 提交于 2020-02-29 14:02:24
这篇算是学习过程中的备忘录,之前没有好好敲过这门课的代码,现在开始把每节课敲的代码记录下来,方便期末复习和以后使用。 第一节课:线性表的基本操作 #include <cstdio>//C++的编译 #include <cstdlib> #include <iostream>//c++输入输出 using namespace std;//命名空间 #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status;// 状态 是个整型 typedef int ElemType; typedef struct{ ElemType *elem;//数据的基地址 int length;//实际长度 }SqList; //1.初始化操作 Status InitList(SqList &L){ //不引用的话,创建可以成功, 但是申请空间给了形参。对参数的值有改变则需要引用,否则都行。 L.elem = new int[MAXSIZE];//MAXSIZE个整形空间 if(L.elem==NULL)//没有申请空间成功,失败 { // printf("fail!"); return ERROR;//exit(OVERFLOW); } L.length=0; return OK; } /

数据结构与算法系列六(栈)

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

数据结构的一些概念

我的未来我决定 提交于 2020-02-29 11:52:18
数据结构 就是研究数据的 逻辑结构 和 物理结构 以及他们之间的相互关系。 数据 :所有能被输入到计算机中,且能被计算机处理的符号集合,是计算机操作对象的总称。 数据元素 :数据中的一个“个体”,数据结构中讨论的基本单位。 数据项 :数据的不可分割的最小单位。一个数据元素有若干个数据项组成。 数据类型 :在一种程序设计语言中,变量所具有的数据种类,整型、浮点型、字符型等等。 逻辑结构 :数据之间的相互关系。 集合结构:数据元素除了同属于一种类型之外,没有无其他关系。 线性结构:数据元素之间是一对一的关系。 树形结构:数据元素之间是一对多的关系。 图状结构或网状结构:数据元素之间是多对多的关系。 物理结构 :也称为存储结构,是数据在计算机中的表示,是描述数据在内存中的存储,如顺序结构、链式结构、索引结构、哈希结构等等。 在数据结构中,从逻辑上可以分为 线性结构 和 非线性结构 。 数据结构基本操作的最重要准则是 实现应用程序与存储结构的独立 。实现应用程序是逻辑结构,存储的是物理结构。逻辑结构是对该结构操作的设定,物理结构是描述数据具体在内存中的存储。 顺序存储结构中 ,线性表的逻辑顺序和物理顺序总是一致的。 链式存储结构中 ,线性表的逻辑顺序和物理顺序一般是不同的。 算法的五个特性 :有穷性,确定性、可行性、输入、输出。 算法的设计要求 :正确性、可读性、健壮性、高效率与低存储需求

数据结构与算法基础------计算时间复杂度

三世轮回 提交于 2020-02-28 23:26:01
算法效率从以下两个方面考虑: 时间效率:指的是算法所耗费的时间 空间效率:指的是算法执行过程中所耗费的存储空间 时间 效率和空间效率有时候是矛盾的。 在这里我们只讨论事前分析法,因为事后分析法也和计算机的软硬件等其他客观条件有关。 事前分析法 一个算法的运行时间大致等于计算机执行一种 简单操作 (如赋值,比较,移动等)所需的时间与算法中进行的 简单操作的次数的乘积 。 以矩阵为例: for ( i = 1 ; i <= n ; i ++ ) //n+1次 for ( j = 1 ; j <= n ; j ++ ) //n*(n+1)次 { c [ i ] [ j ] = 0 ; //n*n次 for ( k = 0 ; k <= n ; k ++ ) //n*n*(n+1)次 c [ i ] [ j ] = c [ i ] [ j ] + a [ i ] [ k ] * b [ k ] [ j ] ; //n*n*n次 } 那么上述算法所消耗的时间是该算法中每条语句的执行次数之和,则消耗的时间T(n)=2n 3 +3n 2 +2n+1。 为了便于比较不同算法的时间效率,我们仅比较他们的数量级。 若某个辅助函数f(n)(即只包含最高数量级的函数),使得当n趋近于无穷大时,T(n)/f(n)的极限值为 不等于零的常数 ,则称f(n)是T(n)的同数量级函数。记作 T(n)=O(f(n)