算法与数据结构

数据结构&算法入门

匿名 (未验证) 提交于 2019-12-03 00:22:01
数据结构是存储,组织 数据 的 方式 算法是完成一个目标的 方法 和 ˼· 公司的核心价值点起始与数据,数据可以预判趋势,指导方向,解决实际问题,掌握了公司的数据,就掌握了公司运营和发展的命脉 是做技术的基础中的基础,是高技术人才的必备能力 装逼利器 什么是数据结构,什么是算法,他们之间的关系,抽象数据类型 数据结构: 数据组织的方式 数据的种类有很多种:整型,浮点型,字符串。。。 数据的组织方式:字典,列表,元组。。。 举例子:数据:‘老王’ 10 ‘男’ 组织方式:列表:[‘老王’,10, ‘男’], 字典{name:’老王’,age:18,gender:’男’} 物理形式 顺序表 链表 逻辑形式 集合,线性,树形,图型 算法 解决问题的方法和思路 公司的核心是 数据 ,数据的组织方式是数据结构,怎么利用这些数据结构完成公司的业务需求,就用到了算法 评判算法的好坏的标准:算法复杂度 时间复杂度:完成一个目标所花费的时间 空间复杂度:完成一个目标所花费的内存空间 数据结构+算法 == 程序,也就是业务需求 程序 + 语言 == 编程 抽象数据类型就是将数据和在这个数据上的运算捆绑在一起。 如魂斗罗中的人物是一种数据类型,打子弹是动作,点击空格键使人物发子弹,那么按一下空格键就生成了一个 抽象数据类型:人物打子弹 为什么引入抽象数据类型的概念

数据结构:时间复杂度和空间复杂度

匿名 (未验证) 提交于 2019-12-03 00:21:02
我们知道,同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。那么一个算法的好坏又由很多因素决定和影响,那么我们怎么衡量一个算法的好坏呢?这里我们引出来 算法复杂度 的概念。算法复杂度又分为 时间复杂度 和 空间复杂度 。下面我们就一一来详细看下时间复杂度和空间复杂度。 首先我们看下官方是怎么定义时间复杂度的:算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。那我们自己通俗一点的解释就是时间复杂度其实就是一个 函数 ,这个函数的功能是什么呢?是 计算执行基本操作的次数 。也就是程序中哪些操作或语句在大量执行,将这些操作认为是整个程序中占用的时间的大小。并且要知道时间复杂度是一个 趋势 ,不是精确的数值,只是粗略 数量级 。 还是用例子能更好的说明问题,我们看下面这个例子: void Test ( int n ) { int iCount = 0 ; for ( int i = 0 ; i < n ; ++ i ) { for ( int j = 0 ; j < 0 ; ++ j ) { iCount ++; } } for

走进数据结构和算法(c++版)(1)――算法时间复杂度

匿名 (未验证) 提交于 2019-12-03 00:18:01
算法时间复杂度定义 T ( n ) T ( n ) 是关于问题规模 n n 的函数,进而分析 T ( n ) T ( n ) 随 n n 的变化情况并确定 T ( n ) T ( n ) 的数量。算法的时间复杂度。也就是算法的时间量度,记做: T ( n ) = O ( f ( n ) ) T ( n ) = O ( f ( n ) ) 。它表示随问题规模 n n 的增大,算法执行时间的增长率和 f ( n ) f ( n ) 的增长率相同,称作算法的 渐近时间复杂度 ,简称为 时间复杂度 。 其中 f ( n ) f ( n ) 是问题规模 n n 的某个函数。 T ( n ) T ( n ) 随问题规模 n n 增加的变化趋势。 一般情况下,随着 n n 的增大, T ( n ) T ( n ) 增长最慢的算法为最优算法。 用常数 1 取代运行时间中的所有加法常数。 再修改后的运行次数函数中,只保留最高阶项。 如果最高阶项存在且不是 1 ,则去除与这个项相乘的常数。 时间复杂度 O ( 1 ) O ( 1 ) int a = 1 ,b= 3 , sum = 0 ;//执行1次 sum = a +b ;//执行1次 cout<< "sum=" << sum <<endl ;//执行1次 时间复杂度 O ( n ) O ( n ) for ( int i = 0 ; i < n;

数据结构课设:高精度算法

匿名 (未验证) 提交于 2019-12-03 00:18:01
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。 . 由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数.因此,在计算位数超过十几位的数时,不能采用现有类型,只能自己编程计算。 ―― [ 百度百科 ] 题目 : ① 整数长度在一百位以上 ② 实现两长整数的加减乘除操作,除法要返回商和余数 ③ 输入输出均在文件中 高精度计算时一般用一个数组来存储一个数,数组的一个元素对应于数的一位(当然,在以后的优化中为了加快计算速度,也可用数组的一个元素表示数的多位数字),表示时

数据结构与算法,应对程序员面试,你必须知道的八大数据结构

匿名 (未验证) 提交于 2019-12-03 00:05:01
什么是数据结构? 简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。首先我们需要理解各种数据结构,才能在处理实际问题时选取最合适的数据结构。 为什么我们需要数据结构? 数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。 无论你以何种方式解决何种问题,你都需要处理数据――无论是涉及员工薪水、股票价格、购物清单,还是只是简单的电话簿问题。 数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。 常见的数据结构 首先列出一些最常见的数据结构,我们将逐一说明: 数组 ջ 队列 链表 树 ͼ 字典树(这是一种高效的树形结构,但值得单独说明) 散列表(哈希表) 数组 数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。下图是一个包含元素(1,2,3和4)的简单数组,数组长度为4。 每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。 以下是数组的两种类型: 一维数组(如上所示) 多维数组(数组的数组) 数组的基本操作 Insert――在指定索引位置插入一个元素 Get――返回指定索引位置的元素 Delete――删除指定索引位置的元素

《数据结构与算法之美》目录

匿名 (未验证) 提交于 2019-12-02 23:59:01
| 数 据结构与算法学习书单 02 | 如何抓住重点,系统高效地学习数据结构与算法? 03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗? 04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 05 | 数组:为什么很多编程语言中数组都从0开始编号? 06 | 链表(上):如何实现LRU缓存淘汰算法? 07 | 链表(下):如何轻松写出正确的链表代码? 08 | 栈:如何实现浏览器的前进和后退功能? 09 | 队列:队列在线程池等有限资源池中的应用 10 | 递归:如何用三行代码找到“最终推荐人”? 11 | 排序(上):为什么插入排序比冒泡排序更受欢迎? 12 | 排序(下):如何用快排思想在O(n)内查找第K大元素? 13 | 线性排序:如何根据年龄给100万用户数据排序? 17 | 跳表:为什么Redis一定要用跳表来实现有序集合? 32 | 字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配? 来源:博客园 作者: 你头发少你先说 链接:https://www.cnblogs.com/createtable/p/11445322.html

数据结构易错知识点(九推)

匿名 (未验证) 提交于 2019-12-02 23:57:01
写在前面: 这篇博文是为接下来九推的笔面试做准备的,用来记录自己模糊易错的知识点,会不断整理,删掉掌握的,增加不熟悉的,一直更到保研结束为止。 之前整理的一些概要: 数据结构 | 1-5章 数据结构 | 二叉树 数据结构 | 第七章 图 数据结构 | 第八章 查找 数据结构 | 第九章 内部排序 2019.7.19 栈是实现过程和函数等子程序所必需的结构 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 有的非线性结构也可以采用顺序存储结构,比如二叉树 要连通具有n个顶点的有向图,至少需要n条边,无向图的话就是n-1条边 无联系、无序的数据没有必要使用指针相连接,不适合用树表示 数组名当被直接使用时,是一个指向数组首地址的指针。如果数组是多维数组,那么数组名是指向第一行数组的首地址,而不是第一行第一列单个元素的地址,所以 *(a+i)与a[i] 是一个意思,当直接用 a[i] 时代表的是该一维数组的首地址,所以 *(a[i]+j)是与a[i][j] 等效 线性表的两种存储结构有什么优缺点? 顺序存储是按索引(如数组下标)来存取数据元素,优点是可以实现快速的随机存取,缺点是插入与删除将引起元素移动,降低效率。对于链式存储,元素存储采取动态分配,利用率高。缺点是须增设指针域,存储数据元素不如顺序存储方便。有点是插入和删除操作简单,只需修改指针域。

数据结构与算法之递归和循环

匿名 (未验证) 提交于 2019-12-02 23:57:01
递归:代码简洁,但是效率低(每次函数调用都有时间和空间的开销); 循环:和递归相反; 1 斐波那契数列 题目:写入一个函数,输入n,求斐波那契(Fibonacci)数列的第n项,斐波那契数列的定义:f(n) = f(n-1) + f(n-2),初始值f(0)=0且f(1)=1; 解题思路: (1)递归:根据f(n)的定义来递归计算; (2)循环:定义三个长整数one、Two和Res,迭代计算; 未完待续~ 来源:博客园 作者: 博1990 链接:https://www.cnblogs.com/bo1990/p/11449220.html

数据结构(复习排序算法)――选泡插(选择,冒泡,插入,希尔)

匿名 (未验证) 提交于 2019-12-02 23:57:01
#include <stdio.h> /** * 希尔排序(优化) * 平均时间复杂度:O(n^1.3) * 平均空间复杂度:O(1) * 稳定性:不稳定 * 思想理念:分组,进行每个gap都进行除以2, * 这样大组分小,有利于数据的移动变小 **/ void shell_sort(int a[],int len){ for(int gap=len>>2;gap>0;gap/=2){ for(int i=gap;i<len;i++){ int j,tmp=a[i]; for(j=i;j>0&&tmp<a[j-gap];j-=gap){ a[j]=a[j-gap]; } a[j]=tmp; } } } /** * 插入排序(优化) * 平均时间复杂度:O(n^2) * 平均空间复杂度:O(1) * 稳定性:稳定 * 思想理念:从前到后进行循环,从后到前循环, * 如果前比后大,用一个下标记住,循环结束之后 * 进行交换 **/ void insertion_sort_update(int a[],int len){ for(int i=1;i<len;i++){ int j,tmp=a[i]; for(j=i;j>0&&tmp<a[j-1];j--){ a[j]=a[j-1]; } a[j]=tmp; } } /** * 插入排序 * 平均时间复杂度:O(n^2) *

20182326 2019-2020-1 《数据结构与面向对象程序设计》实验六报告

纵然是瞬间 提交于 2019-12-02 23:56:48
20182326 2019-2020-1 《数据结构与面向对象程序设计》实验六报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 刘颖洁 学号:20182326 实验教师:王志强 实验日期:2019年10月21日 必修/选修: 必修 1.实验内容 1.链表练习,要求实现下列功能: 通过键盘输入一些整数,建立一个链表; 这些数是你学号中依次取出的两位数。 再加上今天的时间。 例如你的学号是 20172301 今天时间是 2018/10/1, 16:23:49秒 数字就是 20, 17,23,1, 20, 18,10,1,16,23,49 打印所有链表元素, 并输出元素的总数。 在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。 例如你叫 张三, 那么这个变量名就是 int nZhangSan = 0; //初始化为 0. 做完这一步,把你的程序签入源代码控制(git push)。 2.链表练习,要求实现下列功能: 实现节点插入、删除、输出操作; 继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器; 从磁盘读取一个文件, 这个文件有两个数字。 从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。 从文件中读入数字2, 插入到链表第 0 位