邓公数据结构C++语言版学习笔记1

1. 对于计算幂2n2^n2n的算法优化
在这里插入图片描述
暴力算法时间复杂度O(n)O(n)O(n)

 __int64 power2BF_I(int n) //幂函数2^n算法(蛮力迭代版),n >= 0{ __int64 pow = 1; //O(1):累积器刜始化为2^0while (0 < n --) //O(n):迭代n轮,每轮都pow <<= 1; //O(1):将累积器翻倍return pow; //O(1):返回累积器
} //O(n) = O(2^r),r为输入指数n的比特位数

在这里插入图片描述
递归优化算法时间复杂度O(logn)O(logn)O(logn)

 //优化算法时间复杂度O(logn)inline __int64 sqr(__int64 a) 
{return a * a; 
}
__int64 power2(int n) //幂函数2^n算法(优化递归版),n >= 0
{ if (0 == n) return 1; //递归基return (n & 1) ? sqr(power2(n >> 1)) << 1 : sqr(power2(n >> 1)); //视n的奇偶分别递归
} //O(logn) = O(r),r为输入指数n的比特位数

循环优化算法时间复杂度O(logn)O(logn)O(logn)

int quickpower(int a,int b)
{ans = 1,base = a;while (b > 0){if (b & 1)ans *= base;  //记录当b为奇数时少乘的一个abase *= base;   b >>= 1;}return ans;
}

2. 对于Fibonacci数列的算法优化
简单递归算法时间复杂度O(2n)O(2^n)O(2n),空间复杂度O(n)O(n)O(n)

__int64 fib(int n)
{return(2 > n) ? (__int64)n : fib(n - 1) + fib(n - 2);
}

线性递归版算法时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)

__int64 fib(int n, __int64& prev)
{if (0 == n){prev = 1;return 0;}else{__int64 prePrev;prev = fib(n - 1, prePrev);return prePrev + prev;}
}

基于动态规划优化时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)

}*/
__int64 fib(int n)
{__int64 f = 0, g = 1;while (0 < n--){g += f;      //第k+1项f = g - f;   //第k项}return f;
}

3. 对于二分法查找算法的进一步思考
<1>.A版本的二分法查找

int BinarySearch_A(int arr[], int num, int low, int high)
{while (low < high){int mid = (low + high) >> 1;//右移运算符 相当于除以2if (num < arr[mid])high = mid;else if (num > arr[mid])low = mid;elsereturn mid;   //成功查找提前终止}return -1;   //查找失败
}

缺点:①有三个分支(if elseif else)每个分支的比较运算占用一定的时间可以优化
②有多个命中元素时,不能保证返回秩最大者(即序号最大)
③失败时,简单地返回-1,而不能指示失败位置

<2>.B版本的二分法查找——从三分支到两分支

int BinarySearch_B(int arr[], int num, int low, int high)
{while (1 < high - low)//每次迭代仅需要一次比较判断,有两个分支;成功查找不能提前终止{int mid = (low + high) >> 1;(num < arr[mid]) ? high = mid : low = mid;//经比较后确定深入[low,mid)或[mid,high)}return(num == arr[low]) ? low : -1;
}

优点:相比于A版本的二分法由三分支到两分支,优化了时间
缺点:①有多个命中元素时,不能保证返回秩最大者(即序号最大)②失败时,简单地返回-1,而不能指示失败位置 ③成功查找不能提前终止

<3>.C版本的二分法查找——解决A版本的所有缺点

int BinarySearch_C(int arr[], int num, int low, int high)
{while (low < high){int mid = (low + high) >> 1;(num < arr[mid]) ? high = mid : low = mid + 1; //比较后深入[low,mid)或(mid,high)}return --low;//返回low-1的目的对于[0,low)内的数不大于num而low可能大于num但是low-1一定为num(如果能够查找成功)而且保证返回秩最大者(即序号最大)
}

优点:①三分支到两分支优化了时间②有多个命中元素时,保证返回秩最大者(即序号最大)③查找失败时,能够返回失败位置
缺点:成功查找不能提前终止
在这里插入图片描述
对二分法进一步的优化可能引出了一个问题——我们为什么要求有多个命中元素时,保证返回秩最大者(即序号最大)?这到底能带给我们什么好处?
以有序向量的插入操作为例,若通过查找操作不仅能够确定可行的插入位置,而且能够在同时存在多个可行位置时保证返回其中的秩最大者,则不仅可以尽可能低减少需移动的后继元素,(插入元素的原理:①先保证数组空间不能够overflow②将插入位置的后继元素向后移动一个一个赋值③将元素插入)更可保证重复的元素按其插入的相对次序排列。对于向量的插入排序等算法的稳定性而言,这一性质更是至关重要。

4. Stack中的逆波兰表达式(RPN)
<1> RPN特点:既不必在事先做任何约定,更无需借助括号强制改变优先级
<2> 如何计算RPN?
简单总结一下:将所有操作数一一压入栈中,如果遇到操作符xxx则就从栈中弹出运算符xxx所需数目的操作数,然后实时对xxx操作符的运算,最终将新结果重新压栈(!!阶乘运算符需要一个操作数,其他+−×÷+-×÷+×÷运算符一般需要两个操作数)
在这里插入图片描述
<3> 如何手工将中缀表达式(infix)转化为RPN表达式亦称作后缀表达式(postfix)?
①用括号显示地表示优先级 ②将运算符移到对应右括号后(表示该运算符优先级的括号)③抹去所有括号 ④稍加整理
在这里插入图片描述
2020/2/20学习清华大学邓俊辉老师的《数据结构C++语言版》笔记,方便复习也供大家参考,如果有错误麻烦在评论指出,互相学习进步!本文代码全部来源于《数据结构C++语言版》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】7月9日题目 Color

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K Special Judge, 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 给一个没有重边的二…

【DP】K星人的语言(2020特长生 T3)

题目大意 给你一个字符串和若干单词&#xff0c;问你最少删除多少字符使其成为若干单词连在一起的字符串 解题思路 设fif_ifi​为前i个位置的最小代价 然后枚举每个单词即可 代码 #include<cstdio> #include<cstring> #include<iostream> #include<al…

HttpClientFactory系列二:集成Polly处理瞬态故障

前言&#xff1a;最近&#xff0c;同事在工作中遇到了使用HttpClient,有些请求超时的问题&#xff0c;辅导员让我下去调研一下&#xff0c;HttpClinet的使用方式已经改成了之前博客中提到的方式&#xff0c;问题的原因我已经找到了&#xff0c;就是因为使用了伪异步&#xff0c…

Loj#6053-简单的函数【Min25筛】

正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数f(pc)pxorcf(p^c)p\ xor\ cf(pc)p xor c&#xff0c;求∑i1nf(i)\sum_{i1}^nf(i)∑i1n​f(i) 解题思路 异或这个东西不太好搞&#xff0c;要考虑怎么求出ggg数组。 当ppp为质数时f(p)p−1f(p)p-1f(p)p−1&am…

邓公数据结构C++语言版学习笔记——二叉树

二叉树的遍历 一. preorder——先序遍历VLR 1. 递归先序遍历 2. 迭代先序遍历 3.先序遍历图解 二. inorder——先序遍历LVR 1. 递归中序遍历 2.迭代中序遍历 3.迭代中序遍历优化空间复杂度 <1>定义直接后继 <2>借用直接后继优化算法 解释&#xff1a;…

二分图匹配--匈牙利算法

文章目录二分图&#xff1a;匹配匈牙利算法代码&#xff1a;二分图&#xff1a; 二分图是一个无向图&#xff0c;点集分成子集X和Y&#xff0c;图中每一条边都是一边在X一边在Y 当且仅当无向图G的每一个回路次数都是偶数时&#xff08;包括0&#xff09;&#xff0c;G就是一个…

CF757F-Team Rocket Rises Again【最短路,DAG支配树】

正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 nnn个点mmm条边的一张无向图&#xff0c;求删除sss以外的一个点改变sss到最多点的最短路。 解题思路 挺裸的一道题的&#xff0c;首先肯定要跑一遍最短路搞出最短路树。 然后如果最短路树上sss到某个点的路…

星座图(2020特长生 T4)

题目大意 给你一棵树&#xff0c;距离为2的两个点代价为wi∗wjw_i*w_jwi​∗wj​&#xff0c;问你最小代价和代价之和 解题思路 搜索这棵树&#xff0c;每次拿父亲和子节点一起计算即可 代码 #include<cstdio> #include<cstring> #include<algorithm> #de…

《Office 365开发入门指南》上市说明和读者服务

写在最开始的话拙作《Office 365开发入门指南》上周开始已经正式在各大书店、在线商城上市&#xff0c;欢迎对Office 365的开发、生态感兴趣的开发者、项目经理、产品经理参考本书&#xff0c;全面了解Office 365带来的全新机遇以及在具体业务应用开发中的场景。写作本书差不多…

简单理解手机快充

浅谈手机快充 背景 智能手机发展这么些年&#xff0c;屏幕显示越来越清晰&#xff0c;拍照像素越来越高&#xff0c;处理器性能越来越强&#xff0c;运行内存甚至开始超过PC&#xff0c;不过手机的续航还是一个问题&#xff1a;处理器性能以及一系列的增强无疑对电池是一个巨…

最短路模板

文章目录dijstraSPFAdijstra #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int MAXN10010,MAXM500010; int inf2147483647; struct XY{int w,to,pre; }e[MAXM];str…

P6499-[COCI2016-2017#2]Burza【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6499 题目大意 nnn个点的一棵树&#xff0c;开始有一个棋子在根处&#xff0c;开始先手选择一个点封锁&#xff0c;然后后手封锁棋子所在点然后移动一步到一个没有封锁的点&#xff0c;之后轮流进行。 先手不知道后手的移动…

各种dp优化

dp优化思路 dp三要素&#xff1a; 状态、决策、转移 dp优化思路&#xff1a; 减少状态总数减少决策时间&#xff08;减少每个状态转移的状态数&#xff09;减少转移时间 矩阵优化dp &#xff08;其实质是优化 “转移”&#xff09; 博客 数据结构优化dp &#xff08;其实…

裁缝师(2011特长生 T2)

题目大意 给你一个NM的布&#xff0c;你可以将最多L块布同时剪一刀&#xff0c;问你把他全部剪成11的最少要多少刀 解题思路#1 直接从中间剪&#xff0c;然后dfs求出一个图&#xff0c;然后每次找L个点去跑 代码#1 #include<queue> #include<cstdio> #include&l…

【送书活动】C# 程序员的自我修养

如果希望成为一个C# 高手&#xff0c;或者至少是合格的C# 程序员&#xff0c;应该懂些什么&#xff1f;《C#从现象到本质》&#xff08;以下简称本书&#xff09;试图回答这个问题。实际上&#xff0c;在本书问世之前&#xff0c;市面上已经有很多优秀的C# 书籍&#xff0c;例如…

【c++算法刷题笔记】——洛谷2

1. 洛谷练习——P1579 哥德巴赫猜想&#xff08;升级版&#xff09; 题目描述&#xff1a; 现在请你编一个程序验证哥德巴赫猜想。 先给出一个奇数n&#xff0c;要求输出3个质数&#xff0c;这3个质数之和等于输入的奇数。 输入格式&#xff1a; 仅有一行&#xff0c;包含一个…

【每日一题】7月10日精讲—矩阵取数游戏

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帅帅经常跟同学玩一个矩阵取数游戏&…

【dfs】民生问题(2011特长生 T4)

题目大意 有n个问题&#xff0c;m个人&#xff0c;每个人可以解决一些问题&#xff0c;问最少选多少个人可以解决所有问题 解题思路 如果一个人解决的问题被别的人包括&#xff0c;那么可以把这个人丢掉 对于一个问题只能由一个人解决&#xff0c;那么直接选这个人 然后枚举…

张善友:自由之精神,中国之队长

张善友&#xff0c;毕业于兰州大学数学系&#xff0c;2006年开始连任微软最有价值专家&#xff08;MVP&#xff09;&#xff0c;一直在社区宣导.NET开源项目&#xff0c;从早期的Mono到.NET Core&#xff0c;在社区被尊称为张队长&#xff0c;在腾讯工作11年后&#xff0c;进行…

CF461D-Appleman and Complicated Task【并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF461D 题目大意 n∗nn*nn∗n的网格需要填上xxx或ooo&#xff0c;其中有kkk个格子已经固定&#xff0c;求有多少中填写方案使得每个格子的四周都有偶数个ooo。 解题思路 约束条件相当于一个格子周围的异或和都为000&#xff…