算法

数据结构之绪论

会有一股神秘感。 提交于 2020-03-05 16:20:07
文章目录 1.基本概念和术语 2.算法和算法分析 1.基本概念和术语 数据:对客观事物的符号表示,在计算机科学中是指所有能输入到计算机并被计算机程序处理的符号的总称 数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象:性质相同的数据元素的集合,是数据的一个子集 数据结构:相互之间存在一种或多种特定关系的数据元素的集合 存储结构:数据结构在计算机中的表示,包括数据元素的表示和关系的表示,有顺序存储结构和链式存储结构 数据类型:刻画操作对象的特性 抽象数据类型:指一个数学模型以及定义在该模型上的一组操作 2.算法和算法分析 算法的五个特性: 有穷性 确定性 可行性 有输入 有输出 算法设计的要求 正确性 可读性 健壮性 效率与低存储量需求 算法效率的度量 事后统计的方法 缺点:一是先必须运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素。 事先分析估算的方法 一个算法是由控制结构(顺序、分支和循环3种)和源操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。通常的做法是,从算法中选取一种对于研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。 算法的渐进时间复杂度,简称时间复杂度:T(n) = O(f(n)) 算法的空间复杂度:S(n) = O(f(n))

告警压缩与降噪

随声附和 提交于 2020-03-05 16:14:38
为何要压缩告警? 运维监控工具/平台,一般是通过配置固定阈值,达到阈值后自动触发/生成告警。如网络中断、闪断;系统升级更新;设备多监控内容多等情况下,更会产生海量告警。以下为告警管理常见问题: 故障期间,告警风暴,手机/邮箱会被海量告警淹没; 运维人员很难从海量告警从筛选出重要告警,容易忽略重要告警; 固定阈值控制,频繁误报、漏报告警; 如何实现告警压缩与降噪? 睿象云智能告警平台 Cloud Alert (后文为:CA)适应不同行业、不同规模、不同运维水平公司的各种告警需求,平台支持多维度告警压缩合并与降噪,帮助您在不遗漏重要告警前提下,快速减少告警。 CA实现告警降噪根据降噪程度不同,分为 事前和事后共 三种方式: 事前:也就是影响告警通知的方式; 事后:不影响告警通知的方式,可以用作事后分析判断。 自动去重压缩; (事前) 规则压缩;(事前) 算法智能降噪(事后) 自动去重(事前) 全量告警推送到CA平台后,CA平台会自动基于时间序列,将相同的事件/告警压缩。不同监控工具去重压缩机制有细微差异:根据 eventId(事件ID)和告警对象,去除重复告警。 规则压缩(事前) 自动 去重后的告警,会按照压缩规则,将相似、同源(同一设备不同类型的信息)告警再次进行压缩。一共分为两种压缩机制,分别是: 算法智能降噪 自定义压缩规则降噪 算法智能降噪 主要原理是将指定时间内的告警

算法图解(读书笔记)

*爱你&永不变心* 提交于 2020-03-05 15:15:17
第一章 二分查找 输入:一个 有序 的元素列表 过程:要查找的元素包含在列表中,二分查找返回其位置,否则返回NULL 对于包含n个元素的列表,用二分查找最多需要 l o g 2 n log_{2}n l o g 2 ​ n 步,简单查找最多需要 n n n 步 算法实现: def binary_search ( list , item ) : low = 0 high = len ( list ) - 1 while low <= high : mid = ( low + high ) / 2 #向下取整 guess = list [ mid ] if guess = item : reutrn mid if guess > item : high = mid - 1 else : low = mid + 1 return None #None 表示空,意味着没有找到指定元素 运行时间为对数时间(O( l o g n log n l o g n )) 最多需要猜测的次数与列表长度相同,这被称为 线性时间 (linear time) O(1)代表常量时间 大O表示法 大O表示法指出了算法运行时间的增速,指出了最糟情况下的运行时间 常见的大O运行时间 O ( l o g n ) O(log n) O ( l o g n ) :对数时间,比线性时间快,例如二分查找 O ( n ) O(n

推荐系统算法框架

心不动则不痛 提交于 2020-03-05 12:08:24
在介绍矩阵分解之前,先让我们明确下推荐系统的场景以及矩阵分解的原理。对于 推荐系统来说存在两大场景即评分预测(rating prediction)与Top-N推荐 (item recommendation,item ranking)。 评分预测场景主要用于评价网站,比如用户给自己看过的电影评多少分(MovieLens),或者用户给自己看过的书籍评价多少分。其中矩阵分解技术主要应用于该场景。 Top-N推荐场景主要用于购物网站或者一般拿不到显式评分信息的网站,即通过用户的隐式反馈信息来给用户推荐一个可能感兴趣的列表以供其参考。其中该场景为排序任务,因此需要排序模型来对其建模。因此,我们接下来更关心评分预测任务。 Ref: https://zhuanlan.zhihu.com/p/35262187 Ref: https://zhuanlan.zhihu.com/p/27502172 来源: CSDN 作者: 人鱼线 链接: https://blog.csdn.net/qfikh/article/details/104655674

Python算法的七个重要特征

别等时光非礼了梦想. 提交于 2020-03-05 12:04:13
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。算法是Python开发中重要知识技能,不可避免的要使用到该技能,那么,Python算法有什么特点呢? 一个Python算法应该具有以下七个重要的特征: 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性(Definiteness):算法的每一步骤必须有确切的定义; 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性); 高效性(High efficiency):执行速度快,占用资源少; 健壮性(Robustness):对数据响应正确。 Python算法除了具有以上特征,还和时间和空间有关系,不同的算法可能用不同的时间、空间或效率来完成同样的任务,因此

Kmeans算法与KNN算法的区别

被刻印的时光 ゝ 提交于 2020-03-05 09:52:22
最近研究数据挖掘的相关知识,总是搞混一些算法之间的关联,俗话说好记性不如烂笔头,还是记下了以备不时之需。 首先明确一点KNN与Kmeans的算法的区别: 1.KNN算法是分类算法,分类算法肯定是需要有学习语料,然后通过学习语料的学习之后的模板来匹配我们的测试语料集,将测试语料集合进行按照预先学习的语料模板来分类 2Kmeans算法是聚类算法,聚类算法与分类算法最大的区别是聚类算法没有学习语料集合。 K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。其聚类过程可以用下图表示: 如图所示,数据样本用圆点表示,每个簇的中心点用叉叉表示。(a)刚开始时是原始数据,杂乱无章,没有label,看起来都一样,都是绿色的。(b)假设 数据集可以分为两类,令K=2,随机在坐标上选两个点,作为两个类的中心点。(c-f)演示了聚类的两种迭代。先划分,把每个数据样本划分到最近的中心点 那一簇;划分完后,更新每个簇的中心,即把该簇的所有数据点的坐标加起来去平均值。这样不断进行”划分—更新—划分—更新”,直到每个簇的中心不在移动为 止。 该算法过程比较简单,但有些东西我们还是需要关注一下,此处,我想说一下"求点中心的算法" 一般来说,求点群中心点的算法你可以很简的使用各个点的X

算法时间复杂度和空间复杂度

陌路散爱 提交于 2020-03-04 23:47:07
算法 即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。 就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。 “条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法 “更好” 。 算法VS程序 很多人误以为程序就是算法,其实不然:算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来的可以运行的代码。 例如,要解决依次输出一维数组中的数据元素的值的问题,首先想到的是使用循环结构( for 或者 while ),在有这个算法的基础上,开始编写程序。 所以, 算法相当于是程序的雏形 。当解决问题时,首先心中要有解决问题的算法,围绕算法编写出程序代码。 有算法一定能解决问题吗? 对于一个问题,想出解决的算法,不一定就能解决这个问题。 例如拧螺母,扳手相对于钳子来说更好使(选择算法的过程),但是在拧的过程(编写程序的过程)中发现螺母生锈拧不动,这时就需要另想办法。 为了避免这种情况的发生,要充分全面地思考问题,尽可能地考虑到所有地可能情况,慎重选择算法(需要在实践中不断地积累经验)。 “好”算法的标准 对于一个问题的算法来说,之所以称之为算法,首先它必须能够解决这个问题(称为准确性)。其次,通过这个算法编写的程序要求在任何情况下不能崩溃(称为健壮性)。 如果准确性和健壮性都满足

Wellner 自适应阈值二值化算法

会有一股神秘感。 提交于 2020-03-04 19:16:11
参考文档: Adaptive Thresholding for the DigitalDesk.pdf       Adaptive Thresholding Using the Integral Image.pdf 一、问题的由来 一个现实: 当用照像机拍摄一副黑纸白字的纸张时,照相机获得的图像并不是真正的黑白图像。不管从什么角度拍摄,这幅图像实际上是灰度或者彩色的。除非仔细的设置灯光,否则照相机所拍摄的放在桌子上的纸张图像并不能代表原始效果。不像在扫描仪或打印机内部,想控制好桌子表面的光源是非常困难的。这个开放的空间可能会受到台灯、吊灯、窗户、移动的影子等影响。人类的视觉系统能自动补偿这些,但是机器没有考虑到这些因素因此拍出的效果会很差。 这个问题在处理那种高对比度的艺术线条或文字时尤为突出,因为这些东西都是真正的黑色或白色。而摄像头会产生一副具有不同等级的灰度图像。许多应用都必须清楚的知道图像的那一部分是纯黑或纯白,以便将文字传递给OCR软件去识别。这些系统无法使用灰度图像(典型的是8位每像素),因此必须将他们转换为黑白图像。这有很多种方式去实现。在某些情况下,如果这些图像最终是给人看的,这些图像会使用一些抖动技术,以便使他们看起来更像灰度图像。但是对于机器处理的过程,比如文字识别,选择复制操作,或多个图像合成,系统就不可以使用抖动的图像。系统仅仅需要简单的线条

Linux磁盘IO调度算法

让人想犯罪 __ 提交于 2020-03-04 19:02:19
A、CFQ(完全公平排队I/O调度程序) 最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器是最好的选择。 CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择。 CFQ赋予I/O请求一个优先级,而I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级。 对于很多IO压力较大的场景就并不是很适应,尤其是IO压力集中在某些进程上的场景。因为这种场景我们需要更多的满足某个或者某几个进程的IO响应速度,而不是让所有的进程公平的使用IO,比如数据库应用。 CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中。 CFQ工作原理: CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,每个队列按照上述规则进行merge和sort。 各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。可以调queued和quantum来优化。 B、NOOP(电梯式调度程序) 在Linux 2.4或更早的版本的调度程序,那时只有这一种I/O调度算法,I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行。 Noop对所有的I/O请求都用FIFO队列形式处理

算法的复杂性

假如想象 提交于 2020-03-04 18:49:13
算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。 一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。 计算机的资源,最重要的是时间和空间(即存储器)资源。 因而,算法的复杂性有时间复杂性和空间复杂性之分。 不言而喻,对于任意给定的问题,设计出复杂性尽可能低的算法是我们在设计算法时追求的一个重要目标; 另一方面,当给定的问题已有多种算法时,选择其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。 因此,算法的复杂性分析对算法的设计或选用有着重要的指导意义和实用价值。 1.时间复杂性: 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性” 例1:设一程序段如下 for (int i = 0; i < n; i++) // (i = 0) 1次 (i < n) n次 (i++) n次 { for (int j = 0; j < n; j++) // (j = 0) n次 (j < n) n*n次 (j++) n*n次 { x++; //(i++) n*n次 } } 可见,这段程序总的执行次数是:T(n)=1+3n+3n*n。 因为时间复杂度是不考虑系数的 所以 T(n)=O(n^2) 2.空间复杂性: