DWZ

什么情况下不能使用最坏情况评估算法的复杂度?

陌路散爱 提交于 2020-08-14 22:37:31
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们从最坏、平均、最好三种情况分析了算法的复杂度,得出结论,通常来说,使用最坏情况来评估算法的复杂度完全够用了。 但是,有些算法是不能使用最坏情况来评估算法的复杂度的。 那么,有哪些算法呢? 本节,我们将从动态数组以及快速排序这两个个例入手来分析不能使用最坏情况评估复杂度的情形。 动态数组 动态数组,对应于Java中的ArrayList,在插入元素时,分成两种情况: 数组未满,元素放在size下标的位置即可; 数组满了,需要扩容,一般扩容为N倍大小,Java里面是1.5倍,扩容时需要创建一个新的数组,并把原来的元素一个一个地拷贝到新的数组中,再插入新的元素; 我简单地写一段代码,你可以感受下: public class DynamicArray { private int[] array; private int size; public DynamicArray(int capacity) { this.array = new int[capacity]; this.size = 0; } // 插入元素,时间复杂度为多少呢? public void add(int element) { //

复杂度分析的套路及常见的复杂度

浪尽此生 提交于 2020-08-13 03:23:49
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。 那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢? 本节,我们就来解决这两个问题。 前情回顾 在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。 在第2节,我们学习了渐近分析法,将算法的复杂度与输入规模挂钩,随着输入规模的增大,算法执行的时间将呈现一种什么样的趋势,将这个趋势用函数表示,再去除低阶项和常数项,就得到了算法的时间复杂度。 在第3节,我们分别从最坏、平均、最好三种情况来分析了算法的复杂度,得出结论,一般使用最坏情况来评估算法的复杂度。 在第4节,我们通过动态数组的插入元素及经典快速排序的时间复杂度,解释了有的时候不能使用最坏情况来评估算法的复杂度。 在第5节,我们从读音、数学、通俗理解三个方面分析了各种表示算法复杂度的符号,得出结论还是使用大O比较香,大O代表了算法的上界,它与前面讲到的最坏情况往往是对应的。 所以,这里所说的套路也是针对大部分情况,也就是最坏情况,对于一些个例,比如经典快排,我们虽然也是使用大O表示他们的复杂度,但是,其实是一种均摊的复杂度。 好了

程序员不能说自己不行啊

和自甴很熟 提交于 2020-08-12 00:19:20
二哥,最近我刚进了一家公司,之前跟你说过,培训出身刚刚毕业,打算在北京打拼。最近进公司,给安排了工作,今天第一次没人带,自己上手搞代码,搞不出,明明挺简单的功能,自己还是做不出,不知道从哪里学习,想赶快熟悉工作,可是自己的能力不行,在地铁上常看二哥原创的作品,平常积极在看,超级希望能自己学到本事,但自己的能力真的有点问题,工作搞不完,害怕被问,害怕任务完不成被辞退。 以上是读者西瓜向我提的一个问题,我觉得挺具有代表性的,所以决定拉出来单独写一篇文章答疑解惑一下。 可以肯定的一点是,任何时候都要说自己不行啊,尤其是男性同胞,可以认怂,但是“不行”这个两个字千万不要轻易说出口,为什么?你懂吧? 人的能力各有不同,但如果你自己都不自信,那又能做好什么事情呢?心理建设非常重要。 记得之前看一个短片,一个小男孩跳了无数次,都无法越过障碍物,但是呢,他身边的同学一直为他加油呐喊,小男孩呢,也从来没有放弃的打算,最后的结果我都快看哭了,他真的跳过去了,他出色地完成了自我挑战。 他的成功,离不开同学们的鼓励,但更重要的是他锲而不舍的精神,心里素质比一般的成年人都要强大。 我现在已经为人父了,虽然我一直标榜自己只有 18 岁,但叫二叔的读者真的越来越多,我已经逆来顺受了。在我的教育观念里,我觉得我家女儿最优秀的一点品质,就是,如果她喜欢一件事,她就会主动去钻研,去摸索,在没有任何外人的帮助下。

如何从最坏、平均、最好的情况分析复杂度?

耗尽温柔 提交于 2020-08-11 23:11:52
本篇文章收录于专辑: http://dwz.win/HjK 前言 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们从事后统计法过渡到渐近分析法,详细讲解了如何进行算法的复杂度分析。 但是,如果遵循严格的渐近分析法,需要掌握大量数学知识,这无疑给我们评估算法的优劣带来了很大的挑战。 那么,有没有更好地评估算法的方法呢? 答案是必然的,本节,我们就从最坏、平均、最好三种情况来分析分析复杂度。 案例 为了便于讲解,我写了一个小例子: public class LinearSearch { public static void main(String[] args) { int[] array = new int[]{1, 8, 9, 3, 5, 6, 10, 13}; int index = search(array, 10); System.out.println("index=" + index); } private static int search(int[] array, int value) { for (int i = 0; i < array.length; i++) { if (array[i] == value) { return i; } } return -1; } } 这个例子使用线性搜索从一个数组中查找一个元素,这个元素有可能存在

复杂度分析的套路及常见的复杂度

风流意气都作罢 提交于 2020-08-11 06:54:32
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。 那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢? 本节,我们就来解决这两个问题。 前情回顾 在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。 在第2节,我们学习了渐近分析法,将算法的复杂度与输入规模挂钩,随着输入规模的增大,算法执行的时间将呈现一种什么样的趋势,将这个趋势用函数表示,再去除低阶项和常数项,就得到了算法的时间复杂度。 在第3节,我们分别从最坏、平均、最好三种情况来分析了算法的复杂度,得出结论,一般使用最坏情况来评估算法的复杂度。 在第4节,我们通过动态数组的插入元素及经典快速排序的时间复杂度,解释了有的时候不能使用最坏情况来评估算法的复杂度。 在第5节,我们从读音、数学、通俗理解三个方面分析了各种表示算法复杂度的符号,得出结论还是使用大O比较香,大O代表了算法的上界,它与前面讲到的最坏情况往往是对应的。 所以,这里所说的套路也是针对大部分情况,也就是最坏情况,对于一些个例,比如经典快排,我们虽然也是使用大O表示他们的复杂度,但是,其实是一种均摊的复杂度。 好了

网络排查工具MTR介绍

旧街凉风 提交于 2020-08-11 03:49:53
常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合ping nslookup tracert 来判断网络的相关特性,这个命令就是 mtr。mtr 全称 my traceroute,是一个把 ping 和 traceroute 合并到一个程序的网络诊断工具。 traceroute默认使用UDP数据包探测,而mtr默认使用ICMP报文探测,ICMP在某些路由节点的优先级要比其他数据包低,所以测试得到的数据可能低于实际情况。 安装方法 1.Windows系统可以直接在https://cdn.ipip.net/17mon/besttrace.exe下载BestTrace工具并安装。也可以在https://github.com/oott123/WinMTR/releases GitHub上下载MTR专用工具,该工具为免安装,下载后可以直接使用。 2.Linux可以直接运行命令进行安装。 # Debian/Ubuntu 系统 apt install mtr # RedHat/CentOS 系统 yum install mtr 3.Apple客户端可以在App store搜索Best NetTools下载安装 4.Android客户端:可以在Google Play上下载TracePing

到底什么才是真正的空间复杂度?

可紊 提交于 2020-08-11 02:00:28
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了复杂度分析的套路和常见的复杂度。 但是,我们的案例基本都是以时间复杂度为主,很少接触到空间复杂度。 那么,到底什么才是真正的空间复杂度呢?在空间与时间发生冲突时又该如何权衡呢? 本节,我们就来解决这两个问题。 来个例子 现在有一个算法是这样的,给定一个数组,将数组中每个元素都乘以2返回,我实现了下面两种形式: private static int[] multi1(int[] array) { int[] newArray = new int[array.length]; for (int i = 0; i < array.length; i++) { newArray[i] = array[i] * 2; } return newArray; } private static int[] multi2(int[] array) { for (int i = 0; i < array.length; i++) { array[i] = array[i] * 2; } return array; } 暂且不论这两个算法孰好孰坏,你来猜猜他们的空间复杂度各是多少? 你可能会说第一个算法的空间复杂度为O

程序员不能说自己不行啊

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-10 13:21:59
二哥,最近我刚进了一家公司,之前跟你说过,培训出身刚刚毕业,打算在北京打拼。最近进公司,给安排了工作,今天第一次没人带,自己上手搞代码,搞不出,明明挺简单的功能,自己还是做不出,不知道从哪里学习,想赶快熟悉工作,可是自己的能力不行,在地铁上常看二哥原创的作品,平常积极在看,超级希望能自己学到本事,但自己的能力真的有点问题,工作搞不完,害怕被问,害怕任务完不成被辞退。 以上是读者西瓜向我提的一个问题,我觉得挺具有代表性的,所以决定拉出来单独写一篇文章答疑解惑一下。 可以肯定的一点是,任何时候都要说自己不行啊,尤其是男性同胞,可以认怂,但是“不行”这个两个字千万不要轻易说出口,为什么?你懂吧? 人的能力各有不同,但如果你自己都不自信,那又能做好什么事情呢?心理建设非常重要。 记得之前看一个短片,一个小男孩跳了无数次,都无法越过障碍物,但是呢,他身边的同学一直为他加油呐喊,小男孩呢,也从来没有放弃的打算,最后的结果我都快看哭了,他真的跳过去了,他出色地完成了自我挑战。 他的成功,离不开同学们的鼓励,但更重要的是他锲而不舍的精神,心里素质比一般的成年人都要强大。 我现在已经为人父了,虽然我一直标榜自己只有 18 岁,但叫二叔的读者真的越来越多,我已经逆来顺受了。在我的教育观念里,我觉得我家女儿最优秀的一点品质,就是,如果她喜欢一件事,她就会主动去钻研,去摸索,在没有任何外人的帮助下。

用c++ 给易语言写支持库学习记录

末鹿安然 提交于 2020-08-08 17:49:27
废话我就不对说 直接开始 易语言官方下载的易语言安装路径下 有一个SDK文件夹 我们点进入cpp文件夹里面提供是c++的SDK elib文件夹里就是sdk 我们新建一个win32项目 这里我用的是VS2015 创建一个空的项目 包含易语言官方的SDK目录即可 需要注意的地方是 预定义处理里面 如果你需要编译成静态库的话 这两个是必不可少的 代码生成选择多线程(MT) 目标平台选择7.0 支持XP系统 如果需要生成fne后缀的(动态链接库)无法静态编译 预处理器需要这样设置 因为dll和lib的宏名不一样如果填写的不对 生成的就不对 主要实现 入口函数dllMain main.cpp 1 #include <windows.h> 2 BOOL APIENTRY DllMain(HMODULE hModule, 3 DWORD ul_reason_for_call, 4 LPVOID lpReserved 5 ) 6 { 7 switch (ul_reason_for_call) 8 { 9 case DLL_PROCESS_ATTACH: 10 case DLL_THREAD_ATTACH: 11 case DLL_THREAD_DETACH: 12 case DLL_PROCESS_DETACH: 13 break ; 14 } 15 return TRUE; 16 } main

复杂度分析的套路及常见的复杂度

淺唱寂寞╮ 提交于 2020-08-04 19:26:43
前言 本篇文章收录于专辑: http://dwz.win/HjK ,点击解锁更多数据结构与算法的知识。 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。 那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢? 本节,我们就来解决这两个问题。 前情回顾 在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。 在第2节,我们学习了渐近分析法,将算法的复杂度与输入规模挂钩,随着输入规模的增大,算法执行的时间将呈现一种什么样的趋势,将这个趋势用函数表示,再去除低阶项和常数项,就得到了算法的时间复杂度。 在第3节,我们分别从最坏、平均、最好三种情况来分析了算法的复杂度,得出结论,一般使用最坏情况来评估算法的复杂度。 在第4节,我们通过动态数组的插入元素及经典快速排序的时间复杂度,解释了有的时候不能使用最坏情况来评估算法的复杂度。 在第5节,我们从读音、数学、通俗理解三个方面分析了各种表示算法复杂度的符号,得出结论还是使用大O比较香,大O代表了算法的上界,它与前面讲到的最坏情况往往是对应的。 所以,这里所说的套路也是针对大部分情况,也就是最坏情况,对于一些个例,比如经典快排,我们虽然也是使用大O表示他们的复杂度,但是,其实是一种均摊的复杂度。 好了