DS学习笔记coursera(4/6;1/6)

课程名称:Algorithmic Toolbox
课程内容:Data Structures and Algorithms
课程网址:https://www.coursera.org/learn/algorithmic-toolbox/home/week/1
课程进度:Week4

Week4

Intro
Divide and conquer algorithm
Non-overlapping不重叠的
在这里插入图片描述

Extremely极端,非常,极其

Linear Search
Degenerate退化,恶化
Particular特别的,格外的
Consult咨询,查阅,查询
Eternity永恒,永生,不朽
Duplicate(v.)重复,复制(adj.)复制的,完全一样的(n.)复制,副本
Pedantic迂腐的,学究气的
递归线性查找算法如下
在这里插入图片描述

A recurrence relation递推关系 is an equation recursively defining a sequence of values
Versus与…相对
Corresponding相应的,相关的
Trivial琐碎的,微不足道的,不重要的

Binary Search
Monotonic non-decreasing单调不减 array
二分查找递归recursive算法如下
在这里插入图片描述

Binary Search Runtime
二分查找迭代iterative算法如下
在这里插入图片描述

Preserve保存,保护,维护
Augment增加,加强,扩大,提高
Instantaneous瞬间的,立即的,立刻的
The runtime of binary search is theta(log n)
Adjacent相邻的,邻近的

Problem Overview and Naïve Solution
Polynomial多项式的
Elementary基本的,基础的,初级的,简单的
Convolution(n.)错综复杂,弯曲,晦涩费解
Coefficient系数
Intermediate中间的,中等的
在这里插入图片描述

多项式乘法算法如上

Naïve Divide and Conquer Algorithm
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
分治,n得是2的指数幂

Faster Divide and Conquer
Theorize理论化
在这里插入图片描述

Karatsuba算法把多项式乘法的四次乘法缩减为三次乘法
在这里插入图片描述在这里插入图片描述在这里插入图片描述

Compound(adj.)复合的(v.)混合,支付,加重(n.)化合物,混合物,复合物
在这里插入图片描述

上述的题还有待进一步分析,原理没有解析明白

What is the Master Theorem
Master theorem主定理
N to the log base 2 of 3 n的(以2为底3的对数)次方
在这里插入图片描述

Proof of the Master Theorem
A to the b a的b次方
在这里插入图片描述

Geometric几何的
Geometric series几何级数(等比级数)
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

Numerator分子 denominator分母
Handy方便的
Recurrence tree
一种较为通俗的使用方法是:遇到这种粗略形式的递推时,先看第一层和第二层的工作量,如果工作量相同,那么从上到下的工作量都是相同的,那么就是第二种情况O(n的d次方logn);如果第一项大于第二项,那么第一项回事所有其他项相形见绌,也就是只剩下O(n的d次方)了,就是第一种情况;如果第一项小于第二项,也就是会继续增加直到需要的的是最下面的一项,也就是O(n的logb a次方),就是第三种情况。
在这里插入图片描述

O时间复杂度,满足实际小于O即可,系数可以不完全一致

Problem Overview
Canonical典型的,经典的
Logarithmic对数的

Selection Sort
在这里插入图片描述在这里插入图片描述

Quadratic平方的,二次方的
在这里插入图片描述

Pessimistic悲观的
Tight紧的,严格的,严密的
Arithmetic series等差级数,算术级数
在这里插入图片描述

Reverse(v.)使反转,颠倒,撤销(adj.)反向的,相反的,反面的(n.)背面,反面
在这里插入图片描述

Merge Sort
在这里插入图片描述在这里插入图片描述

Split(v.)分裂,分开(n.)分裂,分离,划分
在这里插入图片描述

Essentially基本上,本质上,根本上
在这里插入图片描述在这里插入图片描述

Recursion tree
在这里插入图片描述

Asymptotically渐进地

Lower Bound for Comparison Based Sorting
Comparison based sorting algorithm基于比较的排序算法
在这里插入图片描述在这里插入图片描述

Decision tree
Non-decreasing order不减的次序 <= <=
Permutation置换,排列,组合
Factorial阶乘
Intuitively凭直觉,直觉地,直观地
在这里插入图片描述在这里插入图片描述

Adoration崇拜,爱慕,热爱,敬慕

Non-Comparison Based Sorting Algorithms
A prime A’
Occurrence发生,出现,存在
在这里插入图片描述

Interval间隔,间隙,间歇
在这里插入图片描述

CountSort,确定每个数字在新数组出现的初始位置,然后遍历原数组,copy1个就移动对应的初始信标+1,直到遍历完成。
在这里插入图片描述在这里插入图片描述

Overview
在这里插入图片描述

Algorithm
Partition分割,割断,分治
Pictorially以图画形式
在这里插入图片描述在这里插入图片描述

Pivot枢轴,中心,支点
Invariant不变的,恒定的
Adjacent相邻,邻近的
在这里插入图片描述

Maintain保持,维修,维持

Random Pivot
State(v.)规定,说明,声明,公布,陈述(n.)状态,情况,国家,州
Unwind放松,轻松,松开,解开
Quadratically二次地,二次方 quadratic二次方的
在这里插入图片描述

N over 4 n/4
在这里插入图片描述在这里插入图片描述

Hypothetically假设,假设地,假定地
From scratch从零开始,入门
在这里插入图片描述在这里插入图片描述

快排采用随机方式确实会很快,因为数组里n/2个数能满足左右各n/4个元素满足大小要求,分散到整个数组里,随机方式很有效。
在这里插入图片描述

随机快排比快排的好处是能做到不取决于输入的时间复杂度的差异小

Running Time Analysis(optional)
Lower Camel Case小驼峰命名法 employeeRecordOne 主要用于命名对象实例和函数
Upper Camel Case 大驼峰命名法 EmployeeRecordOne 主要用于命名类
Intuition直觉
Partition分割,分治,隔断
Pivot中心,枢纽,支点
Subsequent随后的,后来的
Balanced partitions save us a lot of comparisons that we do not need to make in the subsequent calls to partition procedure
在这里插入图片描述在这里插入图片描述

从两个数被比较的可能性来说,以第一个问题为例,如果选择2345678作为pivot那1和9自然不会被比较因为处于pivot两次肯定知道谁大谁小,但是如果选了1或者9就需要比较这两个数了,所以比较的可能性是2/9。以第二个问题为例,3和4中间没有合适的pivot可以选,这两个数是必定要比较的。
在这里插入图片描述

如果比较发生了,那肯定是其中一个数被选为pivot了。
Assort分类,协调
Quadratic平方的,二次方的
Split分裂,分开
在这里插入图片描述

Adjacent相邻,邻近的
Vertically垂直地,直立地
Harmonic series调和级数
在这里插入图片描述

如上通过调和级数有限项求和得到后半部分,前半部分放缩得到小于等于2n。

Equal Elements
Prioritize优先处理
Assumption假设,假定
Comparative比较的,相比的,相对的
Sequence序列,顺序,次序
在这里插入图片描述

如果全是相等的元素,quick sort algorithm每一次分裂都分成了极不平衡的两部分,其实还没有merge sort快。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
针对相等元素问题修改的quicksort如上

Final Remarks
在这里插入图片描述在这里插入图片描述

在递归分成的两部分中选择短的先处理,这么做有利于把空间使用控制在最坏情况也是对数空间。(这里的原理需要进一步分析一下)
Eliminate消除,排除,消灭
Deterministic基于决定论的,不可抗拒的,不可逆转的
Heuristic(adj.)启发式的(n.)探索性步骤
Efficiently有效地,效率高地
Pathological不理智的,无法控制的,无道理的
Asymptotically渐进地
Heap sort堆排序
在这里插入图片描述在这里插入图片描述

Quicksort的总结如上
Partition分割,隔断,分治
在这里插入图片描述在这里插入图片描述在这里插入图片描述

上面这一题不太理解,需要进一步思考
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

上面三个连续题的原理没有弄清楚,间隔着选到右数第二个然后选最右边的就通过了不知道理由是什么。

Week4coding
在这里插入图片描述在这里插入图片描述

#include
#include
#include

using namespace std;

int BS(int num[],int end,int target)
{
int left=0;
int right=end-1;
int mid=(left+right)/2;
while(left<=right)
{
mid=(left+right)/2;
if(target==num[mid])
return mid;
else if(target>num[mid])
left=mid+1;
else if(target<num[mid])
right=mid-1;
}
return -1;
}

int main()
{
int i,n,m;
cin >> n;
int nums1[n];
for (i = 0; i < n;i++)
{
cin >> nums1[i];
}
cin >> m;
int nums2[m];
for (i = 0; i < m; i++)
{
cin >> nums2[i];
}
int out;
for(i=0;i<m-1;i++)
{
out=BS(nums1,n,nums2[i]);
cout << out<<’ ';
}
out = BS(nums1, n, nums2[m-1]);
cout << out;
return 0;
}

此题已AC。这道题要注意left和right的变化动作,既然分成了三类目标比较,那就不要做变化为等于mid的动作了,直接接着+1或-1,否则如样例会在11的测试中陷入死循环。函数的数组参数C++应该是int a[]而不是C的int[] a,这个可以验证一下。最后要注意输出的格式。

在这里插入图片描述在这里插入图片描述

#include
#include
#include

using namespace std;

int BS(int num[], int end, int target)
{
int left = 0;
int right = end - 1;
int mid = (left + right) / 2;
while (left <= right)
{
mid = (left + right) / 2;
if (target == num[mid])
return mid;
else if (target > num[mid])
left = mid + 1;
else if (target < num[mid])
right = mid - 1;
}
return -1;
}
int leftcheck(int num[],int out)
{
if(out==-1)
return -1;
int i = out;
while(i>=0)
{
if(num[i]==num[out])
i–;
else
return i+1;
}
return 0;
}

int main()
{
int i, n, m;
cin >> n;
int nums1[n];
for (i = 0; i < n; i++)
{
cin >> nums1[i];
}
cin >> m;
int nums2[m];
for (i = 0; i < m; i++)
{
cin >> nums2[i];
}
int out,outcheck;
for (i = 0; i < m - 1; i++)
{
out = BS(nums1, n, nums2[i]);
outcheck = leftcheck(nums1, out);
cout << outcheck << ’ ';
}
out = BS(nums1, n, nums2[m - 1]);
outcheck = leftcheck(nums1, out);
cout << outcheck;
return 0;
}

此题已AC。理论上这一题的分治策略有更好的方法,但是沿用4.2.1普通的分治策略也可以,只需要分治确定位置后,加上向左遍历的一遍看是否有相等的值然后返回最左端的index即可

在这里插入图片描述

#include
#include

using namespace std;

int main()
{
int n;
cin >> n;
int a[n];
int i,j,flag=0;
for(i=0;i<n;i++)
{
cin >> a[i];
}
sort(a, a + n);
for(i=0;i<=(n-1)/2;i++)
{
j = i + n / 2;
if (a[i] ==a[j])
{
flag = 1;
break;
}
}
cout << flag;
return 0;
}
此题已AC。这道题有点取巧了因为直接使用了C++库的sort函数,如果有机会还是需要手打一遍快排,除此之外就是需要注意排好序后,双指针的位置要考究一点,不要越界或者小了1,因为涉及到了除法。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值