数组公式

归并排序

你。 提交于 2019-12-03 10:52:55
   归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时,将划分的有序子数组组合并成一个更大的有序数组。        算法分析:     分,也就是把原数组划分成两个子数组的过程。     治,它将两个有序数组合并成一个更大的有序数组。   它将数组平均分成两部分:center=(left+right)/2,当数组分的足够小时(数组中只有一个元素时),只有一个元素的数组自然而然地就可以视为是有序的,此时就可以进行合并操作了。因此,上面讲的合并两个有序的子数组,是从只有一个元素的两个字数组开始合并的。   合并后的元素个数:从1->2->4->8->...   举例:   比如初始数组为:[24,13,25,1,2,27,38,15]     1)分成了两个大小相等的子数组:[24,13,25,1],[2,27,38,15]     2)再划分成四个大小相等的子数组:[24,13],[25,1],[2,27],[38,15]     3)此时,left<right还是成立的,再分为:[24],[13],[25],[1],[2],[27],[38],[15]   此时,有8个小数组,每个数组都可以视为有序的数组!每个数组中的left=right,从递归中返回,故开始执行合并(第21行):     merge(

20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

泪湿孤枕 提交于 2019-12-03 10:08:26
目录 20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 评分标准 点评模板: 点评过的同学博客和代码 其他(感悟、思考等,可选) 学习进度条 参考资料 20182306 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 · 时间复杂度:增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n) · 时间复杂度越低,程序运行效率越高。时间复杂度的计算可通过寻找运行次数最多的程序,计算他的运行次数,取n的最高次方的极数,即为程序的时间复杂度 · 栈可以理解为一类数据的集合,栈中的元素可以写入,也可以读出。元素存在先后次序。先入栈的先被读出。栈可用数组,链表两种形式实现。 · 有push,pop,peek,isempty,size等常用操作 · 链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node · 队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。 · 队尾(tail),队首(head),队列前端(front),队列末端

快速排序,归并排序,堆排序的数组和单链表实现

和自甴很熟 提交于 2019-12-03 07:11:42
原文链接: https://www.cnblogs.com/DarrenChan/p/8807112.html 这三个排序的时间复杂度都是O(nlogn),所以这里放到一起说。 回到顶部 1. 快速排序 # 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 最优时间复杂度:O(nlogn) 最坏时间复杂度:O(n2) 稳定性:不稳定 从一开始快速排序平均需要花费O(n log n)时间的描述并不明显

笔记:数据结构与算法

隐身守侯 提交于 2019-12-03 02:31:02
数据结构与算法 常用排序算法 实现比较丑陋,勿喷啊 冒泡排序 :从前向后比较相邻的元素。如果前一个比后一个大,就交换他们两个,每一轮把一个最大的数运到数组最后面。 public static int[] sort(int[] arr) { int len = arr.length; // 冒泡总次数 for (int i = 1; i < len; i++) { boolean flag = true; // 每次冒泡过程 for (int j = 0; j < len - i; j++) { if (arr[j] > arr[j + 1]) { MyUtils.swap(arr, j, j + 1); flag = false; } } if (flag) { // 如果一个冒泡过程没改变,退出返回已经有序 break; } } return arr; } 选择排序 :每次从未排序数组中找一个最小的元素,放到以有序数组后面 public static int[] sort(int[] arr) { int len = arr.length; // 选择次数 for (int i = 0; i < len - 1; i++) { int min = i; // 每次选择过程 for (int j = i + 1; j < len; j++) { if (arr[j] < arr

Leetcode――718. Maximum Length of Repeated Subarray(DP重要)

匿名 (未验证) 提交于 2019-12-03 00:18:01
https://leetcode.com/problems/maximum-length-of-repeated-subarray/description/ Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays. Example 1: Input: A: [1,2,3,2,1] B: [3,2,1,4,7] Output: 3 Explanation: The repeated subarray with maximum length is [3, 2, 1]. Note: 1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100 我们使用一个二维的 dp 数组,其中 dp[i][j] 表示数组A的前i个数字和数组B的前j个数字的最长子数组的长度,如果dp[i][j]不为0,则A中第i个数组和B中第j个数字必须相等,比对于这两个数组[1,2,3,2,1]和[3,2,1,4,7],我们的dp数组为: 数组 1 2 3 2 1 3 0 0 1 0 0 2 0 0 0 2 0 1 1 0 0 0 3 4 0 0 0 0 0 7 0 0 0 0 0 观察dp[i][j]不为0的点

numpy模块

匿名 (未验证) 提交于 2019-12-03 00:13:02
Ŀ¼ 1) arange 2) linspace/logspace 3) zeros/ones/eye/empty 4) reshape numpy是Python的一种开源的数值扩展库,这种库可用来存储和处理大型numpy数组比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。 numpy库有两个作用: import numpy as np l1=[1,2,3] l2=[4,5,6] l=[] for i in range(len(l1)): l.append(l1[i]*l2[i]) print(l) arr1=np.array(l1) arr2=np.array(l2) print(arr1*arr2) ''' [4, 10, 18] [ 4 10 18] ''' 如果我们想让l1*l2得到一个结果为[4,10,18]的列表用到了for循环,非常复杂。 numpy数组即numpy的ndarray的对象,创建numpy数组就是把一个列表传入np.array()方法。 # 创建一维的ndarray对象 arr = np.array([1,2,3]) print(arr,type(arr)) [1 2 3] <class 'numpy.ndarray'> #创建二维的ndarray对象 print(np.array([1,2,3],[4,5,6])) '

时间和空间复杂度

匿名 (未验证) 提交于 2019-12-02 23:59:01
复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半了。 数据结构和算法解决是 “如何让计算机更快时间、更省空间的解决问题”。 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。 和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。 掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。 算法的执行时间与每行代码的执行次数成正比,用 T(n) = O(f(n)) 表示,其中 T(n) 表示算法执行总时间,f(n) 表示每行代码执行总次数,而 n 往往表示数据的规模。这就是大 O 时间复杂度表示法。 1)定义 算法的时间复杂度,也就是算法的时间量度。 大 O 时间复杂度表示法 实际上并不具体表示代码真正的执行时间,而是表示 代码执行时间随数据规模增长的变化趋势 ,所以也叫 渐进时间复杂度 ,简称 时间复杂度 (asymptotic time complexity)。 例子1: function aFun() { console.log("Hello, World!"); // 需要执行 1 次 return 0; // 需要执行 1 次 }

数据结构--循环队列

匿名 (未验证) 提交于 2019-12-02 23:56:01
一.顺序队列的改进 队列元素的出列是在队头,即下标为0的位置,那也就意味着, 队列 中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n)。 可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,比如也可以是a[1]等。 而为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。 对于队列 最好的方法是使用链表实现 ,因为对于数组来说,队列可能会出现下面这种情况: 假设是长度为5的数组,初始状态,空队列如所示,front与 rear指针均指向下标为0的位置。然后入队a1、a2、a3、a4, front指针依然指向下标为0位置,而rear指针指向下标为4的位置。 出队a1、a2,则front指针指向下标为2的位置,rear不变,如下图所示,再入队a5,此时front指针不变,rear指针移动到数组之外。嗯?数组之外,那将是哪里? 问题还不止于此。假设这个队列的总个数不超过5个,但目前如果接着入队的话,因数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上

差分数组与前缀和

匿名 (未验证) 提交于 2019-12-02 23:48:02
前缀和 前缀和顾名思义就是前面i个数的总和。 假设有一个序列A,前缀和为S。根据概念很容易知到公式 \(S[i]=\displaystyle \sum_{j=1}^iA[j]\) 如何求区间 \([l,r]\) 的和呢? \(sum[l,r]=s[r]-s[l-1]\) 那如果要对多个不同区间 \([l,r]\) 进行加减操作呢?然后输出某个区间 \([l,r]\) 的区间和,接下来就要用到差分数组了 差分数组 设原数组为 \(A[i]\) ,差分数组为 \(B[i]\) ,则: \[B[i]=\begin{cases} A[i]&i=1\\ A[i]-A[i-1]&i\geq2 \end{cases}\] 差分数组的性质: 如果对区间 \([l,r]\) 进行修改,只需修改 \(B[l],B[r+1]\) ( \(B[l]\) 加上修改值, \(B[r+1]\) 减去修改值) \(A[i]=\displaystyle \sum_{j=1}^{i}B[j]\) (通过 \(B[i]=A[i]-A[i-1]\) 证明) $S[x]=\displaystyle \sum_{i=1}^{x}A[i]=\displaystyle \sum_{i=1}^{x} \displaystyle \sum_{j=1}^{i}B[j]=\displaystyle \sum _{i=1}^{x}(x-i

初识指针之遍历数组

匿名 (未验证) 提交于 2019-12-02 23:40:02
试题描述 定义一维整型数组x,并输入数组元素个数N。要求使用指针运算的方法遍历数组并对数组各个元素进行赋值及输出操作。 要求使用如下公式给数组各个元素赋值: x[i] = 600 * cos(i * 0.35) 输入 输入一个整数N(0 < N < 1000)。 输出 逐个输出数组中的N个元素,邻近两数之间用一个空格隔开。 输入示例 5 输出示例 600 563 458 298 101 数据范围 输入和输出均为int范围的整数,对于100%的数据,0 < N < 1000 #include "stdio.h" #include "math.h" void main() { int x[1000]={0},N,i; int *p,*y; y=&N; p=x; scanf("%d",&*y); for(i=0;i<*y;i++) { *p=600*cos(i*0.35); printf("%d ",*p); } } 文章来源: https://blog.csdn.net/Lhw_666/article/details/91415083