算法

数据结构-王道-绪论

☆樱花仙子☆ 提交于 2020-03-30 09:43:06
目录 绪论 四种逻辑关系 储存方式 数据结构的三个组成部分 抽象数据类型 算法 特性 时间/空间 复杂度 计算的方法通常有两种 空间复杂度 绪论 数据 :客观事物的符号表示.在计算机科学中指的是所有能输入到计算机中冰杯计算机程序处理的符号的总称. 数据又分为 数值型数据,非数值型数据 数据元素 :是数据的 基本单位 ,在程序中通常会作为一个 整体 来进行处理和考虑. 数据项 :一个数据元素可由多个 数据项(Data Item) 组成。 最小单位 : 数据项 是数据的不可分割的 最小单位 , 数据项 是对客观事物 某一方面特性的数据描述 。 例如 :按照学生的成绩进行排名。1:在计算机中找到学生们的数据,每一个学生的数据都是一个 数据元素(基本单位) ,其中含有关于学生各方面属性的 数据项(最小单位) ,然后我们按照每个 学生(数据元素) 的 成绩(数据项) 对 学生(数据元素) 这个整体进行排名。 数据对象(Data Object) :是性质相同的 数据元素(基本单位,整体考虑) 的集合,是数据的一个子集。如字符集合 \(C=\{'A','B','C',...\}\) 。 数据结构 :指的是相互之间存在一定的关系的数据元素的集合。元素之间的相互联系称为逻辑结构。 四种逻辑关系 集合 :结构中的数据元素除了“同属于一个集合”外,没有其他的任何关系。 线性结构

poj 3264

落花浮王杯 提交于 2020-03-30 08:22:01
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的 算法 。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。 2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法无法在有效的时间内查询出正解。 本节介绍了一种比较高效的在线算法(ST算法)解决这个问题。所谓在线算法,是指用户每输入一个查询便马上处理一个查询。该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询。ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。 (一)首先是预处理,用动态规划(DP)解决。 设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态) 例如: A数列为:3 2 4 5 6 8 1 2 9 7 F[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。同理 F

RMQ算法模板

◇◆丶佛笑我妖孽 提交于 2020-03-30 08:21:36
2、 RMQ算法(转载) 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法也许会存在问题。 本节介绍了一种比较高效的在线算法(ST算法)解决这个问题。所谓在线算法,是指用户每输入一个查询便马上处理一个查询。该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询。ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。 首先是预处理,用动态规划(DP)解决。设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的最大值。例如数列3 2 4 5 6 8 1 2 9 7,F[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。 F[1,2]=5,F[1,3]=8,F[2,0]=2,F[2,1]=4……从这里可以看出F[i,0]其实就等于A[i]。这样,DP的状态、初值都已经有了,剩下的就是状态转移方程。我们把F[i,j]平均分成两段(因为f[i,j]一定是偶数个数字),从i到i+2^(j-1)-1为一段,i+2^(j-1)到i+2^j-1为一段(长度都为2^(j-1))。用上例说明,当i=1,j=3时就是3,2,4,5 和 6,8,1,2这两段。F[i,j

lvs模式及算法

混江龙づ霸主 提交于 2020-03-30 07:00:16
一、三种模式 (一)、Virtual Servervia Network Address Translation( VS/NAT )   通过网路地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,在返回给客户,完成整个负载调度过程。 请求过程: 数据返回: (二)、Virtual Server via IP Tunneling( VS/TUN )   采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接反回给客户,所以调度器只处理请求报文,由于一把网络服务应答比请求报文大许多,采用VS/TUN技术后,集群系统的最大吞吐量可以提高10倍 (三)、Virtual Server via Direct Ro uting( VS/DR )   VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户,同VS/TUN技术一样,VS/DR技术可极极大地提高集群系统的伸缩性,这种方法没有IP隧道的开销,对集群中的真实服务器都有一块网卡连在同一物理网段上。 二、十种算法 (一)、轮叫调度   调度器通过“轮叫

机器学习/梯度下降算法

扶醉桌前 提交于 2020-03-29 12:34:31
当在现实生活中的遇到问题时,我们总是希望找到最佳的解决方案。制造软件产品也是一样的道理,最优化的程序才是最理想的产品。 最优化意味着获得最佳输出。它既是一个数学的重要分支,也在现实生活中有着重要的作用。现代的计算机科学和人工智能科学把最优化作为一个重要的领域来研究。我们也认为人工智能的一些算法,就是模拟了人类寻求实际问题最优解的过程。例如,利用人工智能算法设计软件,配合外部的电子设备例如摄像头识别人脸;利用数据挖掘和神经网络算法来寻找投资的最佳时机等等,都是利用了最优化的原理。 机器学习中的最优化和其他学科的应用比起来有轻微的差异。一般来说,在优化的同时,我们确切地知道数据的外观以及我们想要改进的地方。 但是在机器学习中,我们不知道“新数据”是怎么样的,更别提对其进行优化了。为了解决这个问题,在机器学习中,我们对训练数据(training data)执行优化,并检查由此新创造出的验证数据(validation data)。 最优化的广泛应用 机械学:设计航空航天产品的表面; 经济学:成本最小化; 物理学:量子计算中的优化时间; 决定最佳运输路线,货架空间优化等等。 许多流行的机器算法都依赖于线性回归,k最近邻,神经网络等技术。优化的应用是无限的,因此它成为了学术界和工业界广泛研究的课题。在本文中,我们将介绍一种称为梯度下降(Gradient Descent)的优化技术。

Java垃圾收集器

∥☆過路亽.° 提交于 2020-03-29 09:13:46
  概述   说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考:    GC需要完成的三件事情:      哪些内存需要回收?     什么时候回收?     如何回收?   经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。   把时间从半个世纪以前拨回到现在,回到我们熟悉的Java语言。第2章介绍了Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由JIT编译器进行一些优化,但在本章基于概念模型的讨论中,大体上可以认为是编译期可知的), 因此这几个区域的内存分配和回收都具备确定 性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或线程结束时

LeetCode算法题-Reverse String(Java实现)

落花浮王杯 提交于 2020-03-29 03:23:31
这是悦乐书的第 205 次更新,第 217 篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344)。编写一个以字符串作为输入并返回字符串的函数。例如: 输入:“hello” 输出:“olleh” 输入:“A man, a plan, a canal: Panama” 输出:“amanaP: lanac a, nalp a, nam A” 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。 02 第一种解法 直接借助StringBuilder类的reverse方法,将原字符串反转。 public String reverseString(String s) { StringBuilder sb = new StringBuilder(s); return sb.reverse().toString(); } 03 第二种解法 使用双指针,一个从0开始,一个从字符串尾部开始,利用循环,进行首尾字符互换。 public String reverseString2(String s) { if (s == null || s.trim().length() <= 1) { return s; } int i = 0; int j = s.length()-1; char

数据结构,算法及线性表总结

て烟熏妆下的殇ゞ 提交于 2020-03-28 20:44:20
1.思维导图 2.重要概念笔记 1.数据结构 1.数据结构定义 -我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对元素进行排序等)而执行的相应操作,这个相应的操作也叫算法。 2.算法 -衡量算法的标准: -时间复杂度:程序大概要执行的次数,而非执行的时间 -空间复杂度:程序执行过程中大概所占用的最大内存空间 -难易程度:用易懂,避免过于复杂 -健壮性 3.连续存储【数组】 -什么叫数组:元素类型相同,大小相等 -数组的优缺点 --优点:存取速度很快 --缺点:插入删除元素很慢 4.离散结构【链表】 -定义:n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点同时每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点 -专业术语 --首节点:存放第一个有效数据的节点 --尾节点:存放最后一个有效数据的节点 --头结点:位于首节点之前的一个节点,头结点并不存放有效的数据,加头结点的目的主要是为了方便对链表的操作 --头指针:指向头结点的指针变量 --尾指针:指向尾节点的指针变量 -确定一个链表需要几个参数:只需要一个头指针参数,因为我们通过头指针可以推算出链表的其他所有信息 -分类: --单链表:每一个节点只有一个指针域 --双链表:每一个节点有两个指针域 -

数据结构、算法及线性表总结

℡╲_俬逩灬. 提交于 2020-03-28 19:23:14
··· //初始化表 void InitList(SqList *&L) { L=new SqList;//为线性表分配空间 L->length=0; } //销毁线性表 void DestoryList(SqList* &L) { delete L;//释放L指向的内存空间 } //获取元素 bool GetElem(SqList *L,int i,ElemType &e) { if(i<1||i>L->length) return false; e=L->data[i-1]; return true; } //插入元素 bool ListInsert(SqList *&L,int i,ElemType e) { if(i<1||i>L->length) return false; i--; for(int j=L->length;j>i;j--) L->data[j] = L->data[j-1]; L->data[i]=e; L->length++; return true; } //删除元素 bool LiseDelete(SqList *&L,int i,ElemType &e) { if(i<1||i>L->length) return false; i--; e=L->datd[i]; for(int j=i;j<L->length-1;j++) L->data[j]