邓公数据结构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,一经查实,立即删除!

相关文章

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

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

邓公数据结构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就是一个…

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

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

简单理解手机快充

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

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

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

工科数学分析无穷级数总结

目录序言一.常数项级数概念1. 什么是常数项无穷级数&#xff1f;2. 级数的收敛性与和两个特别的级数级数的判别方法①常数项级数判别法②正项级数的审敛准则③变号级数的审敛准则④绝对收敛二.函数项级数概念1. 什么是函数项级数&#xff1f;2. 函数项级数处处收敛与和函数一致…

dump解析入门-用VS解析dump文件进行排障

突然有一天部署在服务器的一个应用挂掉了&#xff0c;没办法只能进入服务器打开【事件查看器】查看下&#xff0c;好不容易找到了打开后一脸懵逼事件查看器查到的内容根本对我们排障没有任何作用。在这个时候如果有对应的dump文件就能派上用场了&#xff0c;只要有dump文件就能…

.NET Core部署中你不了解的框架依赖与独立部署

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9703460.htmlNET Core项目发布的时候你有没有注意到这两个选项呢&#xff1f;有没有纠结过框架依赖与独立部署到底有什么区别呢&#xff1f;如果有的话那么这篇文章可以参考下&#xff01;为什么…

dump文件解析之探索.Net的内存

前言&#xff1a;对于需要长时间运行的.net程序&#xff0c;有时需要我们查看内存的使用有没有内存泄露问题。我们可以从dump文件中找到答案。Dump的看点用dump文件来分析内存&#xff0c;到底我们需要关心哪些点呢&#xff1f;内存的使用情况 HeapSize/object的数量 也就是托管…

微软发布Azure Pipelines,开源项目可无限制使用CI/CD

微软发布了Azure Pipelines&#xff0c;他们新的CI/CD服务&#xff0c;是Azure DevOps产品的一部分。Azure Pipelines可用于构建、测试和部署工作负载&#xff0c;并可以让各种语言、项目类型和平台协同工作。作为Visual Studio Team Services&#xff08;VSTS&#xff09;的后…

2020牛客暑期多校训练营(第一场)

文章目录A B-Suffix ArrayB Infinite TreeC DominoD Quadratic FormE Counting Spanning TreesF Infinite String Comparision题意&#xff1a;题解&#xff1a;代码&#xff1a;G BaXianGuoHai, GeXianShenTongH Minimum-cost FlowI 1 or 2J Easy Integration题意题解代码2020…

C# 接受MQTT服务器推送的消息

前言&#xff1a;MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议&#xff0c;采用轻量级发布和订阅消息传输机制。大家可以直接上GitHub下载MQQT服务的源码&#xff0c;源码地址&#xff1a;https://github.com/mqtt/mqtt.github.io/wiki/libraries主要内容…

Boundary(2020多校第二场B)

Boundary&#xff08;2020多校第二场B&#xff09; 文章目录题意&#xff1a;题解&#xff1a;思路1&#xff1a;代码&#xff1a;思路二代码题意&#xff1a; 坐标平面有n个点&#xff08;不与原点&#xff08;0,0&#xff09;重复&#xff09;,现考虑一个圆&#xff0c;&…

.NET Core开发日志——Linux版本的SQL Server

SQL Server 2017版本已经可以在Linux系统上安装&#xff0c;但我在尝试.NET Core跨平台开发的时候使用的是Mac系统&#xff0c;所以这里记录了在Mac上安装SQL Server的过程。最新的SQL Server没有专门为Mac系统准备安装包&#xff0c;但由于Mac系统上支持Docker&#xff0c;所以…

【倍增】【线段树】雨林跳跃(luogu 7599[APIO 2021 T2])

正题 luogu 7599[APIO 2021 T2] 题目大意 给你一排树中每棵树的高度&#xff0c;每次跳跃可以跳到左/右边第一棵比该树高的树&#xff0c;问你从A-B中某棵树跳到C-D中的某棵树的最小步数&#xff08;A⩽B<C⩽DA\leqslant B< C\leqslant DA⩽B<C⩽D&#xff09; 解题…

dotnetClub 的前世今生

三年之前&#xff0c;我做过一个在线调查&#xff0c;当时有不少人还是对一个在线社区表示出期待。.NET Core 技术正风声水起&#xff0c;所以我就开始了用它来开发一个论坛的计划。最近正式将项目推动到了一个 MVP 的状态。感兴趣的朋友&#xff0c;现在可以访问 preview.dotn…

【每日一题】7月13日题目精讲—Kingdom

【每日一题】7月13日题目精讲—Kingdom 文章目录题目描述题解&#xff1a;代码:时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 1048576K&#xff0c;其他语言2097152K 64bit IO Format: %lld题目描述 X王国有n位官员&#xff0c;编号从1到n。国…