时间复杂度

拓扑排序

这一生的挚爱 提交于 2020-03-01 20:25:34
1,定义 (1)AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。AOV网中的弧表示活动之间存在的某种制约更新。其中AOV网中不能存在回路。 (2)拓扑排序:对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。 例如 :设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前,则我们称这样的顶点序列为一个拓扑序列。 说明 :所谓拓扑排序其实就是对一个有向图构造拓扑序列的过程。 2,拓扑排序算法 从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,重复操作指导输出全部顶点或者AOV网中不存在入度为0的顶点为止。 说明 :前面的最小生成树和最短路径都是使用的 邻接矩阵 ,由于拓扑排序过程需要删除顶点,所以我们使用 邻接表 会更加方便,而且需要在顶点表中加入入度域,我们会根据顶点的入度决定是否删除。 例如,我们将下面的AOV网转邻接表: 对于转换的实现,我们需要借助栈或者队列来实现,都可以。 3,拓扑排序代码实现 Status TopologicalSort ( AdjGraphList AG

python刷LeetCode:35. 搜索插入位置

自作多情 提交于 2020-03-01 16:18:10
难度等级:简单 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1: 输入: [1,3,5,6], 5 输出: 2 示例 2: 输入: [1,3,5,6], 2 输出: 1 示例 3: 输入: [1,3,5,6], 7 输出: 4 示例 4: 输入: [1,3,5,6], 0 输出: 0 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/search-insert-position 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路: 1、暴力解法,逐渐遍历对比,此方法时间复杂度是O(n)。 2、二分法查找,笔者采用此方法,最快,时间复杂度是O(log n) 解题代码: class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) -1 while True: index = int((left + right)/2) if target > nums[index]: # 更新左右边界索引 left = index else: right

牛客网在线编程专题《剑指offer-面试题40》数组中只出现一次的数字

≡放荡痞女 提交于 2020-03-01 03:40:37
我的个人 微信公众号: Microstrong 微信公众号ID: MicrostrongAI 微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步! 知乎主页:https://www.zhihu.com/people/MicrostrongAI/activities Github:https://github.com/Microstrong0305 个人博客:https://blog.csdn.net/program_developer 题目链接: https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 解题思路: (1)以空间复杂度换时间复杂度 空间复杂度 ,时间复杂度 。 已经AC的代码: # -*- coding:utf-8 -*- class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self,

Python数据结构与算法(一)

▼魔方 西西 提交于 2020-03-01 02:26:31
Python数据结构与算法(一) 引 入 题目:如果a+b+c=1000且a^2+ b^2 =c^2,求出a,b,c可能组合。 方式一: import time start_time = time . time ( ) for a in range ( 0 , 1001 ) : for b in range ( 0 , 1001 ) : for c in range ( 0 , 1001 ) : if ( ( a + b + c ) == 1000 ) and ( a ** 2 + b ** 2 == c ** 2 ) : print ( 'a={},b={},c={}' . format ( a , b , c ) ) end_time = time . time ( ) print ( end_time - start_time ) print ( 'over' ) a=0,b=500,c=500 a=200,b=375,c=425 a=375,b=200,c=425 a=500,b=0,c=500 227.9280366897583 over 方式二: import time start_time = time . time ( ) for a in range ( 0 , 1001 ) : for b in range ( 0 , 1001 ) : c = 1000 - a

深信服面试2020春招一面c/c++

人走茶凉 提交于 2020-02-29 21:58:18
好几个问题蒙了,,还是太紧张 比较struct大小,能不能用memcmp为什么 按位(bit)定义结构体怎么操作 怎么判断两个链表是否交叉 用hash去除大量url中重复的url 快排思想,复杂度,最坏情况 堆排序,大顶小顶,从大量数据中找到最大值,时间复杂度 static的用法,特性 tcp三次握手,第三次丢失会怎么样,针对此问题引起的攻击,怎么设计防火墙 tcp是怎么可靠传输的 100层楼,用2个球,最坏几次测试找到该楼层 计算一个文件的长度 链表能不能二分查找为什么,二分时间复杂度 udp去connect tcp会发生什么 malloc与new区别,用free去释放new出来的对象会发生什么 记不住了。。。我还是太菜 来源: CSDN 作者: ejdjdk 链接: https://blog.csdn.net/weixin_42281802/article/details/104576565

数据结构的一些概念

我的未来我决定 提交于 2020-02-29 11:52:18
数据结构 就是研究数据的 逻辑结构 和 物理结构 以及他们之间的相互关系。 数据 :所有能被输入到计算机中,且能被计算机处理的符号集合,是计算机操作对象的总称。 数据元素 :数据中的一个“个体”,数据结构中讨论的基本单位。 数据项 :数据的不可分割的最小单位。一个数据元素有若干个数据项组成。 数据类型 :在一种程序设计语言中,变量所具有的数据种类,整型、浮点型、字符型等等。 逻辑结构 :数据之间的相互关系。 集合结构:数据元素除了同属于一种类型之外,没有无其他关系。 线性结构:数据元素之间是一对一的关系。 树形结构:数据元素之间是一对多的关系。 图状结构或网状结构:数据元素之间是多对多的关系。 物理结构 :也称为存储结构,是数据在计算机中的表示,是描述数据在内存中的存储,如顺序结构、链式结构、索引结构、哈希结构等等。 在数据结构中,从逻辑上可以分为 线性结构 和 非线性结构 。 数据结构基本操作的最重要准则是 实现应用程序与存储结构的独立 。实现应用程序是逻辑结构,存储的是物理结构。逻辑结构是对该结构操作的设定,物理结构是描述数据具体在内存中的存储。 顺序存储结构中 ,线性表的逻辑顺序和物理顺序总是一致的。 链式存储结构中 ,线性表的逻辑顺序和物理顺序一般是不同的。 算法的五个特性 :有穷性,确定性、可行性、输入、输出。 算法的设计要求 :正确性、可读性、健壮性、高效率与低存储需求

IT公司100题-5-查找最小的k个元素

北慕城南 提交于 2020-02-29 06:04:10
问题描述: 输入n 个整数,输出其中最小的k 个。 例如输入8, 7, 6, 5, 4, 3, 2, 1这8 个数字,则最小的3 个数字为3, 2, 1。 问题分析: 时间复杂度O(nlogn)方法: 对n个整数升序排序,取数组前面k个数就是最小的k个数,时间复杂度为O(nlogn),空间复杂度为O(1)。 大顶堆,时间复杂度为O(nlogk): 我们可以采用大顶堆来保存最小的k个数,堆顶元素就是k个最小的数中最大的。新来一个元素的时候,与堆顶元素进行比较,如果比堆顶元素大,则直接丢弃。如果比堆顶元素小,则替换堆顶元素,并且进行大顶推的调整,需要O(logk)的时间。所以总的时间复杂度为O(nlogk),空间复杂度为O(k)。 TreeSe t , 时间复杂度为O(nlogk): TreeSet容器的内部结构通常由红黑树来实现,所以查找、删除和插入操作都只需要O(logk)的时间。 代码实现: package oschina.IT100; /** * @project: oschina * @filename: IT5.java * @version: 0.10 * @author: JM Han * @date: 10:52 2015/11/2 * @comment: 输入n 个整数,输出其中最小的k 个。 * @comment: 例如输入8, 7, 6, 5, 4, 3, 2,

堆排序

此生再无相见时 提交于 2020-02-29 02:46:42
堆排序 堆排序的主要思想 关于什么是堆,可以看看 二叉堆 。这里就不在啰嗦了。 关于堆,我们知道有个最主要的性质,对于 最大堆 ,堆顶的元素总是最大的,对于 最小堆 ,堆顶的元素总是最小的。所以如果我们将一个数组转化成一个堆,在反复执行删除堆顶元素的操作,那么每次删除的元素必然是有序的,也就实现了我们排序的效果。 因此,堆排序的步骤主要两点: 构建堆,将一个数组转化成一个堆,我们在MaxHeap.md中有总结,时间复杂度是O(n log 2 n) 遍历删除堆顶的元素,我们知道删除堆顶元的时间复杂对是O(log 2 n),那么如果堆中有n个元素,则时间复杂度变成O(nlog 2 n)。由此得出堆排序的时间复杂度是O(nlog 2 n)。 综上所述,我们发现如果这样做,那么时间复杂度是没有问题的,但是空间上则需要使用一个附加的数组来存储每次删除的元素,使得存储需求增加一倍。那么这个问题怎么规避呢,我们知道删除堆顶元素后,为了维护堆的性质,我们的做法是将最后一个元素放到堆顶位置,在进行siftDown()操作。比如下图,我们删除97后,会将31放到堆顶 (这个时候31的位置就空下来了) ,然后调整堆。那么我们就可以利用这一点,将97放到空下来的位置。然后依次类推,我们在删除59,那么还是31的位置空下来,我们在将59放到空下来的位置,直到堆中剩下一个元素

算法之排序(上)

守給你的承諾、 提交于 2020-02-27 08:02:47
文章来源: http://blog.seclibs.com/算法之排序(上)/ 排序算法有很多种,甚至有很多都完全没有听过,我们最常见,也最经典的就是:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。 按照时间复杂度来进行划分可以将其划分为三类 O(n2) :冒泡、插入、选择;基于比较 O(nlogn):快排、归并;基于比较 O(n):桶、计数、基数;不基于比较 这次我们来说时间复杂度为O(n2)的 在说具体的排序方法之前,先明确排序算法的评价标准 首先是排序算法的执行效率,执行效率一般从最好、最坏、平均时间复杂度上分析,其分析时间复杂度时需要考虑系数、常数和低阶,因为时间复杂度是在数据规模特别大的时候的增长趋势,在平时的代码中,数量级都是比较小的,所以还需要考虑这些问题。在基于比较的排序算法中,数值比较的次数和数据的移动次数也都是需要考虑进去的。 其次是内存的消耗,算法的内存消耗可以用空间复杂度来表示,当空间复杂度为O(1)的算法也可以称之为原地排序算法。 最后是算法的稳定性,当一组数据中有两个相同的值时,排序之后两个值的顺序是如果没有交换那它就是具有稳定性的算法。 然后我们再引入两个概念, 有序度 和 逆序度 有序度 是数组中具有有序关系的元素对的个数。 比如说2、4、3、1、5、6这组数组的有序度是11,因为它有11个有序元素对,分别是(2,4)

《C语言》—— 数组

馋奶兔 提交于 2020-02-27 03:45:24
书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗。——高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!! 前言  我本来准备C语言章节就写个指针就ok了,在我看来C语言的精华部分就是指针了。但是有很多同学就开始在群里各种拉扯C语言的其他问题,没办法,我是龙叔嘛,想想还是整理一下,把一些重要的C语言知识点都一一更新了吧。C语言指针的内容请点击 指针(上) 和 指针(下) , 记得点关注,不迷路 数组的基本概念  我们把一组数据的集合称为 数组(Array) ,它所包含的每一个数据叫做 数组元素 (Element),所包含的数据的个数称为 数组长度 (Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为 下标 (Index),所包含数组的里面元素的类型叫做 数组类型 (Type)。  一句话就说清楚了数组的基本概念,就是这么简单,^_^。 数组底层结构探析 1int array[5]; 内存布局图  不要看这个图简单,底层就是这样的。数组是一个整体,它的内存是 连续 的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。   这一点很重要,连续的内存为 指针 操作(通过指针来访问数组元素)和内存处理