时间复杂度

架构师必备之高性能架构学习路线:消息中间件,Nginx,Redis等!

一曲冷凌霜 提交于 2020-02-26 01:47:31
一)Zookeeper分布式环境指挥官 zookeeper基础 ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。ZooKeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。 分布式应用的优点 (1)可靠性 - 单个或几个系统的故障不会使整个系统出现故障。 (2)可扩展性 - 可以在需要时增加性能,通过添加更多机器,在应用程序配置中进行微小的更改,而不会有停机时间。 (3)透明性 - 隐藏系统的复杂性,并将其显示为单个实体/应用程序。 分布式应用的挑战 (1)竞争条件 - 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。 (2)死锁 - 两个或多个操作等待彼此无限期完成。 (3)不一致 - 数据的部分失败。 二)Nginx高并发分流进阶实战 nginx如何实现高并发 简单来讲,就是异步,非阻塞,使用了epoll和大量的底层代码优化。 稍微详细一点展开的话,就是nginx的特殊进程模型和事件模型的设计。 进程模型 nginx采用一个master进程,多个woker进程的模式。 master进程主要负责收集、分发请求。当一个请求过来时

Codeforces Round #624 (Div. 3)

ぐ巨炮叔叔 提交于 2020-02-26 00:34:29
A.题意:通过加奇数减偶数的操作从a到b最少需要几步 签到题 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <deque> #include <map> using namespace std; typedef long long ll; const double inf=1e20; const int maxn=100005; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ ll a,b; scanf("%lld%lld",&a,&b); ll c=b-a; if(c==0){ printf("0\n"); }else if(c>0&&c%2==0){ printf("2\n"); }else if(c<0&&c%2!=0){ printf("2\n"); } else printf("1\n"); } return 0; } B.题意:有一个数组p,你可以任意次交换a[p i ]和a[p i +1],问能不能把数组变成一个非严格上升的子序列。 解:很明显,如果p数组中有连续的一段

数据结构之数组

僤鯓⒐⒋嵵緔 提交于 2020-02-25 17:13:19
文章来源: http://blog.seclibs.com/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e4%b9%8b%e6%95%b0%e7%bb%84/ 在说数组之前咱们先明确两个概念,什么是 线性表 ,什么是 非线性表 顾名思义,线性表就是把数据排成一条,每个数据只有前后两种情况,常见的线性表有 数组、链表、队列、栈 等 那非线性表就更好理解了,数据不是按照一条线来排列的,每个数据并不只有前后两个方向,常见的有 二叉树、堆、图 等 明白了这个概念之后,咱们再来说数组,什么是数组? 数组不仅是大多数编程语言中的一个数据类型,它更是一个最基础的数据结构。 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 关于线性表前面已经说过了,接下来说具有连续的内存空间、存储相同类型的数据,也正是因为这一点才使数组有了 随机访问 的特性。 我们拿下面这个例子来进行说明,有一个长度为10的int类型的数组,我们给它分配一块连续内存空间 1000~1039,内存块的首地址为1000 当我们需要访问其中的数据的时候,计算机会先通过一个寻址公式来找到内存地址,然后再读取其中的数据。 在数组中我们使用的寻址公式为 a[i]_address = base_address + i * data_type_size base

时间复杂度分析

隐身守侯 提交于 2020-02-25 16:17:02
在上一篇文章中我们提到了时间复杂度大O分析法的使用,这次继续来探究时间复杂度的分析 我们先来看一下下面这段代码 这段代码的作用是在数组中寻找x的位置,找到了直接返回位置,没有找到的话返回-1,用上一篇文章所学到的知识,可以很清楚的看出来,这段代码的时间复杂度为O(n) 但是这段代码明显还有优化的空间,如果我们在数组中间寻找到x的话,就不需要把整个数组都循环一边了,所以可以优化为下面这段代码。 如果在这种情况下的话,就不能用上一次所说到的方法来衡量了,因为我们不知道需要寻找的x所在的位置在哪里,如果在第一个的话,它的时间复杂度就是O(1),如果这个数组里没有的话,就需要全部遍历一遍,它的时间复杂度就是O(n),这里就需要引入 最好时间复杂度 和 最坏时间复杂度 顾名思义,最好时间复杂度就是在最理想的状态下的时间复杂度,就是我们前面说的,所需要找的x恰好是数组的第一个字符,时间复杂度为O(1) 最坏时间复杂度就是在最糟糕的情况下的时间复杂度,就是前面说的需要寻找的x不在数组中的情况,时间复杂度就是O(n) 但是问题又来了,不管是最好还是最坏,它们发生的概率都是非常小的,都不能真正代表它的时间复杂度,这里我们就需要再引入一个概念: 平均时间复杂度 还是前面的例子,我们把x在每一个位置上所需要便利的个数都加起来然后再处以总次数n+1来求平均,这样的话我们就能够得到平均时间复杂度了

java基础-004

和自甴很熟 提交于 2020-02-25 15:46:57
---恢复内容开始--- 14.Java集合类框架的基本接口    集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有的不允许.   Java集合提供了一套设计良好的支持对一组对象进行操作的接口和类.Java集合类里面最基本的接口有:   I> Collection:代表一组对象,每一个对象都是它的子元素   II> Set:不包含重复元素的Cllection   III> List:有顺序的Collection,并且可以包含重复元素   IV> Map:可以把键(key)映射到值(value)的对象,键不能重复   集合类没有实现cloneable和serializable接口:   克隆(cloning)或者是序列化(serialization)的语义和含义是根据具体的实现相关的.因此,应该由集合类的具体实现来决定如何被克隆或者序列化. 15.迭代器(iterator)   iterator接口提供了很多岁集合元素进行迭代方法.每一个集合类都包含了可以返回迭代器实例的迭代方法.迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除.   Iterator和ListIterator的区比别:   I

[数据结构与算法] 优先级队列/堆队列 完全二叉堆 左式堆 python里的heapq

≯℡__Kan透↙ 提交于 2020-02-25 15:23:07
学习 清华大学 尊敬的邓俊辉老师的C++数据结构与算法课程 第10章 优先级队列,本文旨在摘要和心得体会。 文章目录 1 优先级队列需求 2 完全二叉堆 2.1 定义 2.2 getMax() 2.3 insert() 插入与上滤 2.4 delMax() 删除与下滤 2.5 heapification 建堆 2.6 就地堆排序 3 左式堆 3.1 堆合并 3.2 左式堆 3.3 左式堆合并算法 3.4 左式堆 插入 3.5 左式堆 删除 4 python里的heapq 1 优先级队列需求 计算机系统里CPU的任务调度, 循 优 先 级 访 问 \color{red}{循优先级访问} 循 优 先 级 访 问 。 不同于队列结构的先进先出,找队列里最大值先出。 约定:优先级队列里的每个数据项目都有一个关键码key,可以进行比较大小(可依靠重载比较操作符实现),关键码越大,优先级越高。 操作接口描述: 操 作 接 口 功 能 描 述 size() 报告优先级队列的规模,即其中词条的总数 insert() 将指定词条插入优先级队列 getMax() 返回优先级最大的词条(若优先级队列非空) delMax() 删除优先级最大的词条(若优先级队列非空) 借助无序列表、有序列表、无序向量或有序向量,都难以同时兼顾insert()和 delMax()操作的高效率

比KMP更快的字符串匹配算法——BM算法

拜拜、爱过 提交于 2020-02-25 14:45:13
引言: KMP的时间复杂度是O(n+m)的 但实际上如果无法匹配成功,这个复杂度一般都是能跑满的 linux下常用的grep就用到了字符串匹配算法,但是使用了更快的BM算法 它的理论时间复杂度也是O(n+m)的,但无论能不能匹配成功,一般它都是跑不满的 也就是它实际对比的字符数量一般都是比(n+m)少很多的,所以用起来平均速度能比KMP快几倍 而最坏时间复杂度也是有保障的 原理: 考虑O(nm)的暴力对比进行字符串匹配,我们总是希望某次失配后能根据已有信息进行尽可能多的跳跃 KMP有自己的next数组来进行跳跃 BM呢?最朴素的,我们有坏字符规则 问题:我们要在长度为n的串s中找到长度为m的串t(下标均从0开始) 坏字符规则: 我们首先预处理出所有字符在t中最后一次出现的位置last-occurence 定义last[i]为字符i最后一次在t中出现的位置,可以O(m)得到last数组 我们从前往后枚举s的下标,确定某个位置后,我们从后往前枚举串t的字符,即 for i in [(m - 1) -> n]:   for j in [(m - 1) -> 0]:     ... 这样进行匹配,当j匹配到某个位置失配,那么可以直接向后移动last[] 来源: https://www.cnblogs.com/ytytzzz/p/11250277.html

算法

旧城冷巷雨未停 提交于 2020-02-24 05:04:31
1.2.3 设计算法 参加信息学竞赛到底是要学的是什么呢?算法。 那么什么是算法? . 1.1 2.3.1 算法有什么用 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。通俗地说算法就是解决问题的过程被机械地执行的动作或指令的有穷集合。算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。 算法的五个重要的特征: 有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性:算法的每一步骤必须有确切的定义; 输入项(input):一个算法有 0 个或多个输入,以刻画运算对象的初始情况,所谓 0 个 输入是指算法本身定出了初始条件; 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。 . 1.2 2.3.2 算法分析 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑

文献阅读02-动态拼车服务中的高效插入操作

眉间皱痕 提交于 2020-02-24 04:57:28
题目:An Efficient Insertion Operator in Dynamic Ridesharing Services (动态拼车服务中的高效插入操作) 作者:Yi Xu (易旭), Yongxin Tong(童永新), Yexuan Shi(叶璇), Qian Tao(钱涛), Ke Xu(柯旭), Wei Li(魏丽) 单位:软件开发环境与环境国家重点实验室;北京航空航天大学北京大数据与脑计 算高级创新中心 研 究 领 域(想做 什么,功 能,应用 或 研 究 背景) 研究当前动态拼车在智能交通应用中的插入操作,改进当前当前插入操作。 针 对 的 问题(要 解 决 什 么 技 术 或 者 研 究问题) 动态拼车中的核心操作是插入操作。给定一个工作者和一条可行路线,其中包含先前 请求中的一系列起点-终点对,则插入操作将新请求的起点-终点对插入到当前路线, 从而优化某些目标。常见的优化目标包括最小化所有请求的最大等待时间/距离,最 小化总旅行时间/距离。但其时间复杂度为 O(n3),其中 n 为分配给工作者的所有请求 的数量。这个时间复杂度从根本上限制了基于城市规模的动态共享应用的效率。 解 决 方 法 的 思 路(总体 基 本 原 理,指出 创 新 之 处) 提出了一个基于分区的框架,将请求集 R+划分为四个不相交的集合,并独立地处理 它们的约束和目标值

文献阅读02-动态拼车服务中的高效插入操作

左心房为你撑大大i 提交于 2020-02-23 17:08:26
题目:An Efficient Insertion Operator in Dynamic Ridesharing Services (动态拼车服务中的高效插入操作) 作者:Yi Xu (易旭), Yongxin Tong(童永新), Yexuan Shi(叶璇), Qian Tao(钱涛), Ke Xu(柯旭), Wei Li(魏丽) 单位:软件开发环境与环境国家重点实验室;北京航空航天大学北京大数据与脑计 算高级创新中心 研 究 领 域(想做 什么,功 能,应用 或 研 究 背景) 研究当前动态拼车在智能交通应用中的插入操作,改进当前当前插入操作。 针 对 的 问题(要 解 决 什 么 技 术 或 者 研 究问题) 动态拼车中的核心操作是插入操作。给定一个工作者和一条可行路线,其中包含先前 请求中的一系列起点-终点对,则插入操作将新请求的起点-终点对插入到当前路线, 从而优化某些目标。常见的优化目标包括最小化所有请求的最大等待时间/距离,最 小化总旅行时间/距离。但其时间复杂度为 O(n3),其中 n 为分配给工作者的所有请求 的数量。这个时间复杂度从根本上限制了基于城市规模的动态共享应用的效率。 解 决 方 法 的 思 路(总体 基 本 原 理,指出 创 新 之 处) 提出了一个基于分区的框架,将请求集 R+划分为四个不相交的集合,并独立地处理 它们的约束和目标值