11 2020 档案
摘要:#include<iostream> #include<string> using namespace std; int main() { int a;//输入的数 int y = 0;//循环中的余数' string s = ""; cin >> a; if (a == 0)//比较特殊,单独处理
阅读全文
摘要:4.1背包问题 动态规划的核心:如何构造一个高效的备忘录,提高整个问题求解的效率。 4.2最大子数组问题II
阅读全文
摘要:分治思想求解的问题,但是比较特殊,只有分解问题和求解小问题,不需要合并 每次也只需要经过判断,分解一半,所以比其他分解两边的效率高 最坏情况时间复杂度为O(n^2),期望时间复杂度为O(n) 找基准值时候可以考虑随机选择 #include<iostream> #include<vector> #in
阅读全文
摘要:性能分析: 时间复杂度:O(n*log(n)) 空间复杂度:O(log(n)) 这里的时间复杂度其实是快速排序最好的时间复杂度,最坏的时间复杂度是O(n^2) 代码里补充的随机化快速排序的期望时间复杂度为:O(n*log(n)) 快速排序的性能优于归并排序是因为常数项,即算法所需的固定时间量。 #i
阅读全文
摘要:还是分治的思想,解决方法利用了归并排序。具体可以看一下这篇博客。 第三章:分治II - 不妨不妨,来日方长 - 博客园 (cnblogs.com) C++代码如下,可以在VS直接运行。 #include<iostream> #include<vector> #include<algorithm> u
阅读全文
摘要:3.1逆序对计数问题 合并这个步骤是比较难的,也会区别于“最大数组问题”的地方。 归并排序的过程正好可以顺便统计逆序对,所以将统计逆序对嵌入到归并排序的算法当中。 所以合并的算法复杂度就降到了归并排序的O(n)。 3.2快速排序 归并排序:分的过程,1/2切开,所以这部分没有话费多少时间,即简化分解
阅读全文
摘要:性能分析: 时间复杂度:O(n^2) 空间复杂度:O(1) 虽然性能跟冒泡排序一样,但是速度上来讲,选择排序要优于冒泡排序,因为减少了数据交换的次数,先找到了最小值的下标,然后将它往前挪。 #include<iostream> #include<vector> using namespace std
阅读全文
摘要:性能分析: 时间复杂度:O(n^2) 空间复杂度:O(1) #include<iostream> #include<vector> using namespace std; int main() { // 思想: // 在原始待排序序列上操作; // 将原始待排序序列分成无序区和有序区两部分; //
阅读全文
摘要:我已无法用语言来描述递归有多牛逼。 #include<iostream> #include<vector> #include<algorithm> using namespace std; int max_sub_array(vector<int>& data, int left, int righ
阅读全文
摘要:2.1归并排序 问题特点:局部有序 快速合并:比较两有序数组当前最小元素,将较小者逐一合入新数组 输入规模越大,两两合并更有效。 但是数组可能没有局部有序特性,需要进行构建:两两合并 这个方法的本质就是归并排序算法。 归:递归 并:合并 2.2递归式求解 (1)递归树法:直观,不好求 (2)代入法:
阅读全文
摘要:性能分析: 时间复杂度:O(n*log(n)) 空间复杂度:O(n) 归并排序算法来自于分而治之思想,“归”是“递归”的意思,“并”是"合并“的意思,就是说将复杂的数组排序问题先进性分解,然后递归的解决小问题,最后合并问题的解。 #include<iostream> #include<vector>
阅读全文
摘要:课程目标: 如何判断哪个算法更高效:需分析比较算法运行效率 如何设计正确高效的算法:需掌握算法设计的方法论 1.1算法的由来 1.2算法的定义 要知道算法的定义,首先要知道计算问题这个概念,就是给定数据输入,计算满足某种性质输出的问题。而输入和输出这两个环节中间的部分,就是算法。 比如经典的排序算法
阅读全文
摘要:性能分析: 时间复杂度:O(n^2) 空间复杂度:O(1) 但是综合来讲,要比冒泡排序和选择排序好一些。 #include<iostream> #include<vector> using namespace std; int main() { // 首先找出待排序列中最小的数,然后用这个数和原序列
阅读全文
摘要:一.sort函数 1.sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑! 2.sort函数的模板有三个参数: void sort (RandomAccessIterator fir
阅读全文
摘要:这个比较简单,想清楚基线条件和递归条件就可以了,直接看代码(VS直接运行): #include<iostream> #include<vector> using namespace std; int arrayMax(int data[], int length); int main() { int
阅读全文
摘要:递归的特点: (1)递归就是在过程或函数里调用自己;(2)在使用递归时,必须有一个明确的递归结束条件,否则会陷入死循环;(3)递归算法通常比较简洁,但运行效率较低;(4)在递归调用的过程中系统为每一层的返回点、局部变量等开辟了栈来存储,所以递归次数过多容易造成栈溢出。(5)调用另一个函数时,当前函数
阅读全文
摘要:简单查找的时间复杂度为O(n) 二分查找的时间复杂度为O(logn) 用递归实现二分查找: 基线条件:数组只包含一个元素。如果如果要查找的值与这个元素相同,就找到了;否则说明不在数组中。 递归条件:把数组分成两半,将其中一半丢弃,并对另一半执行二分查找。 C++代码实现如下(VS可以直接运行): #
阅读全文