算法与数据结构

数据结构与算法(一):概论

穿精又带淫゛_ 提交于 2019-12-29 21:26:54
一、什么是数据结构?什么是算法?   1.数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。   2.数据结构是为算法服务的,算法是要作用再特定的数据结构上的。 二、学习的重点    1.效率和资源消耗的度量衡--复杂度分析   2.搞定复杂度分析后,后面就是数据结构与算法的正文内容了,如下所示: 作为初学者和非算法工程师,只需要掌握最常用、最基础的20个数据结构与算法,学习他们的:“来历”、“特点”、“适合解决什么问题”和“实际的应用场景”,分别是一下10个数据结构和10个算法: 数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树; 算法: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 三、如何学习    1.熟悉理论知识   2.练习(https://leetcode-cn.com/problemset/algorithms/) 来源: https://www.cnblogs.com/573583868wuy/p/9801516.html

算法与数据结构 开篇概论

被刻印的时光 ゝ 提交于 2019-12-29 21:26:40
线索 数据结构课程的概论,从以下这条线索进行阐述: 问题 -> 数学化(数学建模) -> 选择数据结构DataStructure -> 算法Algorithm 及 设计步骤 -> 验证正确性 -> efficient效率检验 -> 程序实现 数据结构 和 数据类型 何为数据结构? 数据结构描述了数据对象之间的结构关系,是相互之间具有一种或者多种特定关系的数据集合。 数据结构,是抽象数据类型ADT的物理实现。 为什么要使用数据结构? 我们需要解决大量的非数值计算问题,由于问题求解的需要,我们经常要自定义一些数据类型和它的一些基础运算,来便于我们解决这些问题。因此我们有了 抽象数据类型(自定义的数据类型) 与 数据结构(抽象数据类型的物理实现)。 数据结构需要考虑哪些问题? (1)数据的逻辑结构:主要分为 线性结构 和 非线性结构。 线性结构有 线性表(数组),队列queue,栈stack等等;非线性结构有 树tree,图map,集合set等等。 (2)数据的物理结构:由数据的逻辑结构决定,在内存中的存储方式,有 连续的 和 不连续的 两种。 连续:在内存中按 连续的相对位置 存放(数组);不连续:在内存中按 无序的相对位置 存放,由指针来确定位置。 (3)数据的运算:为了解决非数值问题,需要定义数据类型,实现数据结构,并定义数据类型的相关计算。 何为抽象数据类型ADT

数据结构与算法概论

﹥>﹥吖頭↗ 提交于 2019-12-29 21:26:25
计算机已经成为我们有力的工具。利用计算机处理数据,我们需要考虑到数据的存储表示,以及对数据的处理。 而数据的表示则要用到我们所说的数据结构,对数据的处理需要用到算法。 1 . 数据结构 对数据的存储表示,我们不仅仅需要保存每个独立数据的值,还需要保存数据中数据元素间的关系。 数据 首先我们来看一下我们的主要对象: 数据 数据指的是所有能够输入到计算机并能够被计算机程序识别和处理的 集合 (1)数据的分类:数值型(整数、实数等)+ 非数值型(图像、语音、文本等) (2)数据的组成:数据元素(由数据项构成)一般数据元素是我们考虑数据时的最小单位 数据元素间的关系 数据中数据元素间的逻辑关系我们可以用数据的逻辑结构来表示。这个是针对数据的 逻辑结构 (1)集合:数据元素间都是平等的,比如接幼儿园小孩子回家在门口等候的父母亲 (2)线性结构:数据间一对一的关系,比如列队 (3)树结构:一对多的层次关系。公司部门里面的领导员工 (4)图结构:数据元素间多对多的任意关系。辩论自由辩时的状态 存储结构(物理结构) 数据的存储表示,我们需要考虑到在计算机中用什么结构去存,这个是针对计算机的 (1)顺序存储:用一组连续的单元存储。此时数据元素间的逻辑关系由她们在内存中的位置呈现。比如按次序列队 (2)链接存储:数据在内存中是可以不连续的。排队过程中总是存在着有人插队,这个可以用飞机场接机来表示

数据结构1 - 概论与算法

浪尽此生 提交于 2019-12-29 21:26:06
一、C 语言知识要点 基础参考教程 1.数组 2.指针 3.结构体 4.对齐与补齐 二、现实问题? 1.如何存储一个班的学生信息与学生关系? 2.如何存储一个公司的人事信息与领导关系? 3.如何存储一个城市的交通红绿灯信息与关系? 三、数据结构概述 解决数据的存储问题 定义:我们把现实中大量且复杂的问题,以特定的数据类型和存储结构保存到内存中,在此存储结构的基础上,实现对数据的增删改查等操作。 个体 + 个体关系 =》决定数据的存储结构 四、算法概述 解决数据的操作问题 衡量算法的标准: 1.时间复杂度:大概要执行的次数,而不是执行的时间。 2.空间复杂度:算法执行过程中大概所占用的最大内存。 3.难易程度 4.健壮性 五、数据结构的地位? 核心课程,学完之后,感觉什么都做不了,但是会促进对其他课程的理解。 栈内存 & 堆内存 操作系统-》队列 编译原理-》语法树 数据库-》表、记录、字段 六、什么是程序? 程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言 七、学习数据结构的方式? 1.伪算法。 2.计算机语言 但是,学习数据结构,需要操作内存地址,必须要使用到拥有指针的语言。 来源: https://www.cnblogs.com/markbin/p/6754779.html

C++后台开发大纲

强颜欢笑 提交于 2019-12-29 14:57:49
学习C++时间不短了,之前比较迷茫,也走了不少弯路,没有一个好的规划,现在决定将学过以及将要学习的内容,整理成笔记,巩固扎实基础的基础上,不断提升自己。No pain,no gain! 将要更新的内容如下(会持续更新): 1.C++语言基础 C++ Primer 第5版 STL源码剖析(侯捷 著) 深度探索C++对象模型(侯捷 译) Effective C++(侯捷 译) 2.数据结构与算法 数据结构 浙大数据结构网上课程( B站链接 ) 算法 C++算法原理与实践( B站链接 ) 刷题 LeetCode中文网站 剑指offer 第2版 3.操作系统 4.计算机网络 5.数据库 6.设计模式 来源: CSDN 作者: 不知紅樓 链接: https://blog.csdn.net/qq63264360/article/details/103753181

数据结构:链表讲解

拈花ヽ惹草 提交于 2019-12-28 15:12:11
数据结构:链表讲解 一、缓存淘汰策略: 缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去?哪些数据应该保留?这就需要缓存淘汰策略来决定。 简单理解: 就是当缓存被用满时清理数据的优先顺序 。 先进先出策略 FIFO(First In, First Out) 最少使用策略 LFU(Least Frequently Used) 最近最少使用策略 LRU(Least Recently Used) 以上策略举个栗子: 假如,你买了很多书,但有一天发现,书太多了,太占书房空间了,打算丢掉一些书籍; 丢到刚买的书:先进先出策略 丢到买完一直都没有读过的书:最少使用策略 丢到最近刚买的书,但是一直都没怎么读过:最近最少使用策略 二、数组与链表的区别: 1.底层存储的结构区别: 我们可以从 底层的存储结构 来看。数组需要一块 连续的内存空间 来存储,对内存的要求比较高。 如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 链表恰恰相反,它并 不需要一块连续的内存空间 ,它通过 指针 将一组零散的内存块串联起来使用,其中,我们把内存块称为链表的 结点 。 为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的 下一个结点的地址 。结点地址的指针叫作 后继指针 next 。

数据结构和算法----两数之和

牧云@^-^@ 提交于 2019-12-28 04:50:22
问题: 给定一个整数数组 nums 和一个目标值 target, 请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。 但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解法一:多层循环暴力解法 public static int [ ] getIndex1 ( int [ ] arrs , int target ) { int [ ] indexArr = new int [ 2 ] ; for ( int i = 0 ; i < arrs . length ; i ++ ) { for ( int j = i + 1 ; j < arrs . length ; j ++ ) { if ( arrs [ i ] + arrs [ j ] == target ) { indexArr = new int [ ] { i , j } ; } } } return indexArr ; } 解法分析: 暴力循环就是把数组中的元素进行两次遍历,每次和后面的元素进行相加, 再和目标值进行比较,如果能找到两数之和为目标值的元素,就返回这两个元素的下标。 时间复杂度: O(n

[数据结构]快速排序

南笙酒味 提交于 2019-12-28 04:09:46
算法思想   快速排序是对冒泡排序的一种改进。其基本思想是基于分治法的;在待排序表L[1….n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和L[k+1…n],使得L[1….k1]中所有元素小于pivot,L[k+1….n]中所有元素大于或等于pivot,则pivot放在了其最终位置L(k)上,这个过程称作一趟快速排序。而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。   首先假设划分算法已知,记为Partition(),返回的是上述中的k,注意到L(k)已经在最终的位置,所以可以先对表进行划分,而后对两个表调用同样的排序操作。因此可以递归地调用快速排序算法进行排序,具体的程序结构如下介绍。 算法代码 void QuickSort(ElemTpye A[],int low,int high){ if(low<high){ //Partition()就是划分操作,将表A[low...high]划分为满足上述条件的两个子表 int pivotpos=Partition(A,low,high);//划分 QuickSort(A,low,pivotpos-1);//依次对两个子表进行递归排序 QuickSort(A,pivotpos+1,high); } }  

数据结构与算法之PHP排序算法(快速排序)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-28 03:47:08
一、基本思想 快速排序又称划分交换排序,是对冒泡排序的一种改进,亦是分而治之思想在排序算法上的典型应用。 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。 二、算法过程 1)从数列中挑出一个元素,称为“基准值”; 2)将待排序元素进行分区,比基准值小的元素放在基准值前面,比基准值大的元素放在基准值后面。分区结束后,该基准值就处于数组的中间位置; 3)对左右两个分区重复以上步骤直到所有元素都是有序的。 三、算法图解及PHP代码实现 1、替换版 上图只给出了第1趟快速排序的流程。在第1趟排序中,设置pivot=arr[i],即pivot=3。 1) 右 → 左 查找小于pivot的数:找到满足条件的数arr[j]=2,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。 2) 左 → 右 查找大于pivot的数:找到满足条件的数arr[i]=4,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。 3) 右 → 左 查找小于pivot的数:找到满足条件的数arr[j]=1,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。 4) 左 → 右

《数据结构与算法图解》算法java代码实现

房东的猫 提交于 2019-12-27 16:41:28
前言 正在读《数据结构与算法图解》一书,被其简单明了的讲解折服,其中涉及到了很多有用的算法,为了加深印象以及理解,便跟着把其中的代码转换为我平时所使用的的语言java。 每种算法的时间复杂度标识出来。 第 1 章 数据结构为何重要 第 2 章 算法为何重要 第 3 章 大O记法 第 4 章 运用大O来给代码提速 第 5 章 用或不用大O来优化代码 第 6 章 乐观地调优 1、插入排序 时间复杂度 /** * @author xch * @params [arrays] * @return int[] * @description 插入排序 */ public static int[] insertSort(int [] arrays) { for (int i = 1; i < arrays.length; i++) { int position = i; int temp = arrays[i]; while (position > 0 && arrays[position - 1] > temp) { arrays[position] = arrays[position - 1]; position = position - 1; } arrays[position] = temp; } System.out.println(JSON.toJSONString(arrays))