首页
精选文章贪心法查看全文贪心算法也称贪婪算法,是指在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而可以得到结果是最好或最优的算法。贪心算法一般用于解决最优子结构的问题,最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。 贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。而动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。 贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码,但是对于很多问题,只是选择当前最优的解可能会导致辛普森悖论(Simpson's Paradox),不一定最终是最优解。单由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。证明贪心算法是否最优解一般有两种方法,归纳法和反证法。如何证明其得出的解不是最优解也可以用这两种方法证明,当然也可与举出反例论证。 步骤1:从某个初始解出发; 步骤2:采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到一部分解,缩小问题规模; 步骤3:将所有解综合起来。 硬币找零 贪心法的介绍我们引入一个场景,硬币找零问题,商家需要用硬币给用户找零,假如每种面值的硬币都无限多,同时用户不想要太多的零钱,那么如果才能使得找零的硬币个数最少?从贪心的角度,应该是先用最大额面值的硬币进行找零,需要找零的金额小于最大面额之后,再用次大面额进行找零,以此类推。这种思想就是贪心法,即每一步都用当前的最优解去解决问题。 商家需要用硬币给用户找零,假如每种面值的硬币都无限多,同时用户不想要太多的零钱…反射【Java】查看全文反射是Java语言的一种机制,可以在运行时获取操作对象的具体类型,而且通过类型可以获取类的构造,包括成员变量以及成员方法,并且可以动态的调用这些方法或者改变这些变量的值。Java一般认为是一门静态语言。静态语言是指编译时就可以确定变量的数据类型的语言,大多数静态语言要求在使用变量之前必须声明数据的类型。常见的静态语言有C、C++、Golang等,Java通常也被认为是静态语言。 PHP、JavaScript、Python、Perl等语言的变量在使用前不需要声明数据类型,在运行时根据被赋值的值类型才确定数据的类型,此类语言称为动态语言。 而通过反射的能力,Java语言可以动态的改变对象的值,甚至可以动态改变数据类型,所以反射使得Java语言具备了动态语言的能力。 Java主要通过Class类来实现反射的能力,JVM在完成一个类的加载过程之后,在堆内存会构造一个Class类型的对象,该对象包含了类完整的构造信息,通过该类可以窥视到Java类的结构,通过Class类可以实例化类的对象,获取类的方法,修改方法的值。 反射是一种“语义同像”,语义同像将程序的一些内部状态,例如对象的属性,对象的方法指针等暴露给程序的运行态,通过这种能力,程序可以在运行时动态修改对象的值。 反射需要存储或者可以关联对象的元信息,因为静态语言在编译时已经可以确定对象的类型,所以这些信息不是运行时的必须信息,为了执行效率,这些信息往往在编译后的信息中剥离,如果要支持反射,就需要存储这些相关的信息。 反射违反了面向对象编程中的封装性。 Java中反射的核心来自Class类。 Class类是描述对象类型信息的类,除了Class类自身之外,所有类都有一个Class类型的对象…UDP查看全文UDP是数据报文协议,是以数据包方式发送和接收报文。和面向连接的TCP协议不同,UDP不需要保证传输的可靠性,所以UDP可以以更加恒定的速度发送数据,所以对很多需要时效的场景更加适用。 UDP提供尽最大努力的交付,不保证可靠交付。所有维护传输可靠性的工作需要用户在应用层来完成。没有TCP的确认机制、重传机制。如果因为网络原因没有传送到对端,UDP也不会给应用层返回错误信息。 UDP是面向报文的,对应用层交下来的报文,添加首部后直接乡下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,报文不可分割,是UDP数据报处理的最小单位。 和TCP相比,在传输协议方面,UDP可以设置的属性较少,不能控制读写数据的次数和数量。数据包的发送和接收都必须是一个整体。 因为UDP不需要保证可靠的传输,所以UDP在传输的生命周期中不需要处理建立连接,断开连接,重传等,不需要维护连接状态,也不需处理流量控制和拥塞控制,所以性能开销较少,传输效率较TCP较高。其实现非常简单,UDP的报文结构也非常简单。 UDP的报文结构简单,只包括传输端以及对端的地址/端口信息,以及报文,报文长度,报文的校验和。 和IP的检验和只校验数据包头部不同,UDP的校验和包括头部和数据部分。 |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库精选内容 |