算法

二分算法入门题--POJ - 1905 和POJ - 3104

二次信任 提交于 2020-01-21 15:26:17
今天又重新回顾二分算法,觉着这两个题目的思路很好。附上一下。 poj-1905 几何+二分 链接: https://vjudge.net/problem/POJ-1905 题目大意 当长度为L的细杆被加热n度时,它扩展到一个新的长度L‘=(1+n*C)*L,其中C是热膨胀系数。当一根细杆安装在两个实心壁上,然后加热时,它就膨胀成一个圆形!!!的节段,原来的杆是节段的弦。你的任务是计算杆中心移位的距离。 每行输入包含三个非负数:杆的初始长度(毫米)、温度变化(以度计)和材料的热膨胀系数。输入数据保证任何杆都不会膨胀超过其原始长度的一半。最后一行输入包含三个负数,不应该进行处理。 然后输出该木棍的中心位移 解题思路: 集合画出来是酱紫的: 由上面那个图,可以得出如下关系: R^2=(R-h)^2+L^2/4; LL(弧长)=2*R*θ; R*sin(θ)=1/2*L; 由上面三个式子可以推出: R=(4*h^2+L^2)/(8*h); LL=2*R*arcsin(L/(2*R)); 又因为,0<=R<=L/2, h=R*(1-cos(θ)); 所以 0<=h<=L/2, 利用二分枚举h,通过LL来进行更新。具体看代码。 #include<iostream>//二分枚举h(高度) #include<cstdio> #include<algorithm> #include<cmath>

0.专栏首页

岁酱吖の 提交于 2020-01-21 14:06:17
1.C#的数据结构杂谈 2.C#写算法之分析时间复杂度&空间复杂度 3.C# 写算法之 数组的基本操作 4.C# 写算法之 找出数组中重复的数字 5.C# 写算法之 链表的基本操作 6.C#写算法之栈的基本操作 7.C#写算法之队列的基本操作 8.C#写算法之散列表 9.C#写算法之二叉树 10.C#写算法之二叉堆 11.C#写算法之优先队列 12.C#写算法之排序算法 13.C#写算法之冒泡排序 14.C#写算法之快速排序 附录: 1.ShareBook 漫画算法-小灰的算法之旅.rar 剑指offer第二版 来源: CSDN 作者: KERVEN_HKW 链接: https://blog.csdn.net/qq_34035956/article/details/104058833

小内存堆管理算法详细解析

偶尔善良 提交于 2020-01-21 11:51:20
1、小内存堆管理算法介绍 本文所介绍的内存堆管理是RT Thread操作系统中的小内存管理算法,参考mem.c源文件。这个程序适用于小内存的CPU,比如像STM32F这样的只有几十-几百KB内存的处理器。整个内存堆的处理算法简洁,高效,现对其中的原理做详细的介绍。首先先写上整个源代码,如下。内存堆的函数只有主要的4个函数:   rt_system_heap_init   rt_malloc   rt_free   plug_holes /*头文件中的相关宏定义 define in header file*/ #define HEAP_MAGIC 0x1ea0 struct heap_mem { /* magic and used flag */ rt_uint16_t magic; rt_uint16_t used; rt_size_t next, prev; #ifdef RT_USING_MEMTRACE rt_uint8_t thread[4]; /* thread name */ #endif }; /** pointer to the heap: for alignment, heap_ptr is now a pointer instead of an array */ static rt_uint8_t *heap_ptr; /** the last entry,

穷举法和递归算法

倾然丶 夕夏残阳落幕 提交于 2020-01-21 10:03:55
枚举算法(穷举法): 特点:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如:找出1到100之间的素数,需要将1到100之间的所有整数进行判断。 枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点: 1、得到的结果肯定是正确的; 2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。 3、通常会涉及到求极值(如最大,最小,最重等)。 4、数据量大的话,可能会造成时间崩溃。 优缺点 优点:算法简单,在局部地方使用枚举法,效果十分的好 缺点:运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢 递归算法: 特点:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候,不再调用。 递归的三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 来源: CSDN 作者: 王同學 链接: https://blog.csdn.net/qq_43605753/article/details/104058317

挥别2019,喜迎2020

送分小仙女□ 提交于 2020-01-21 09:38:46
导语: 都说遇到问题,去问度娘,度娘有你想要的答案,可今天,打开百度网页,却戛然而止。只因看到19图标在不停的在向后移动。时间飞逝,又到了2019年的年末,时间在不停的飞逝,1秒,2秒,……脑袋也在不停的转动,却也只能看着图标在向后移动,无从下手。思索着怎么样才能找到自己想要的答案。 人生座右铭: 路漫漫其修远兮,吾将上下而求索。 ---- 屈原《离骚》 年终 总结目录: 2019:挥别2019,喜迎2020 2020:期待…… 追忆生活: 展望2019,2019过得如何?总的来说是平淡无奇,平时下班后就是看看新闻,开阔视野,打篮球,锻炼身体,身体才是革命的本钱;周末便是看电影、看动漫,看动漫是从小到现在的爱好,曾今被人家取外号叫:老小孩;但依然兴趣不减。周末2-3日的短旅行也是不错的,长期高压下的工作,偶尔是要放松一下自己,让以后的工作更加充实。其余的就是在家自己做做饭,平淡且惬意,或许这才是正真的生活吧。 新年flag(生活): 1.长胖,我要努力长胖。可能是因为我从小就体弱多病,造就了我现在这个易瘦体质,我现在怎么吃都不见长胖,这一两年一直保持在56KG左右。在2020年,一定要涨到60KG,定要勤加锻炼,保持身心健康。 2.阅读,选择一本读物,并且在一年内看完,理解。2017年读完了姜戎的《狼图腾》,主要讲述了上个世纪六七十年代一位知青在内蒙古草原插队时与草原狼

线性代数精华——从正交向量到正交矩阵

情到浓时终转凉″ 提交于 2020-01-21 09:33:01
向量内积 这个基本上是中学当中数学课本上的概念,两个向量的 内积 非常简单,我们直接看公式回顾一下: \[X \cdot Y = \sum_{i=1}^n x_i*y_i\] 这里X和Y都是n维的向量,两个向量能够计算内积的前提是两个向量的维度一样。从上面公式可以看出来,两个向量的内积就等于两个向量对应各个维度的分量的乘积的和。 为了和矩阵乘法以及普通的乘法做区分,我们通常把两个向量的内积写成: \([x, y]=x^Ty\) 。 这里有一个很重要的性质,对于一个向量而言,我们可以用欧几里得公式计算它的长度。进一步,我们可以用向量的长度以及向量之间的夹角来表示向量的内积,如下: \[[x, y]=|x|\cdot |y|\cos\theta\] 其中的 \(\theta\) 是x和y向量之间的夹角,对于三维及以下空间内的向量,这一点非常直观。对于高维度的向量,我们很难想象它的物理意义。不过没有关系,我们一样可以认为向量之间存在一个 广义超空间 内的一个夹角。在机器学习领域,我们通常用这个夹角来反应 向量之间的相似度 。两个向量越相似,那么它们之间的夹角应该越小,对应的cos余弦值应该越大。所以我们可以用两个向量之间的余弦值来反应它们之间的相似度。余弦值的计算就源于此。 正交向量 从上面的公式可以看出来,向量的内积等于两个向量长度乘上向量之间的夹角。对于非零向量而言

(算法练习)——1313. 解压缩编码列表(简单)

耗尽温柔 提交于 2020-01-21 08:16:31
要求: https://leetcode-cn.com/problems/decompress-run-length-encoded-list/ 不习惯写函数的形式,后面都写的实现,当练手感了 代码: # include <stdio.h> # include <string.h> int main ( ) { int record [ 100 ] ; int i = 0 ; int newrecord [ 1010 ] ; int signal = 0 ; while ( scanf ( "%d" , & record [ i ] ) != EOF ) { i ++ ; if ( getchar ( ) == '\n' ) { int len = sizeof ( record ) / sizeof ( record [ 0 ] ) ; for ( int j = 0 ; j < i ; j ++ ) { if ( j % 2 == 0 ) { for ( int t = 0 ; t < record [ j ] ; t ++ ) { newrecord [ signal ] = record [ j + 1 ] ; signal ++ ; } } } for ( int s = 0 ; s < signal ; s ++ ) { printf ( "%d " ,

行为型模式@模板方法模式 亦称: Template Method

久未见 提交于 2020-01-21 05:37:56
意图 模板方法模式 是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 (PDF、 DOC 或 CSV) 的文档, 程序则会试图从这些文件中抽取有意义的数据, 并以统一的格式将其返回给用户。 该程序的首个版本仅支持 DOC 文件。 在接下来的一个版本中, 程序能够支持 CSV 文件。 一个月后, 你 “教会” 了程序从 PDF 文件中抽取数据。 一段时间后, 你发现这三个类中包含许多相似代码。 尽管这些类处理不同数据格式的代码完全不同, 但数据处理和分析的代码却几乎完全一样。 如果能在保持算法结构完整的情况下去除重复代码 , 这难道不是一件很棒的事情吗? 还有另一个与使用这些类的客户端代码相关的问题: 客户端代码中包含许多条件语句, 以根据不同的处理对象类型选择合适的处理过程。 如果所有处理数据的类都拥有相同的接口或基类, 那么你就可以 去除客户端代码中的条件语句 , 转而 使用多态机制 来在处理对象上调用函数。 解决方案 模板方法模式建议将算法分解为一系列步骤, 然后将这些步骤改写为方法, 最后在 “模板方法” 中依次调用这些方法。 步骤可以是 抽象 的, 也可以有一些默认的实现。 为了能够使用算法, 客户端需要自行提供子类并实现所有的抽象步骤。

高并发常用解决方案汇总

倾然丶 夕夏残阳落幕 提交于 2020-01-21 05:11:17
1、扩容 扩容思路: u 垂直扩容(纵向扩展):提高系统部件能力 u 水平扩容(横向扩展):增加更多系统成员来实现 数据库扩容: 读操作扩展:memcache、redis、CDN等缓存 写操作扩展:Cassandra、Hbase 2、缓存 (1) 浏览器:页面静态化 (2) 网络转发:nginx反向代理 (3) 应用服务:集群 (4) 数据库:读写分离、分表分库 缓存特性: 命中率:命中数/(命中数+没有命中数) 最大元素(空间) 清空策略:FIFO(先进先出)、LFU(淘汰一定时期内被访问次数最少的)、LRU(淘汰最长时间未被使用的)、过期时间、随机等 一般来说:项目中开发,使用缓存的时候,都是读多写少; 可以使用复制特性扩展读性能 可以使用客户端分片扩展写性能 缓存分类和应用场景 本地缓存:编程实现(成员变量、局部变量、静态变量)、Guava Cache 分布式缓存:Memcache、Redis Guava Cache相当于利用hashmap实现了本地缓存的管理 高并发场景下缓存常见问题 u 缓存一致性 u 缓存并发问题 u 缓存穿透问题 u 缓存的雪崩现象 缓存一致性 雪崩: 执行了增删改操作,此时缓存中并没有key所对应的数据(缓存被清除了),那么可能某一时间点,多个请求同时访问,越过缓存服务器直接访问数据库服务器,造成服务雪崩现象; 解决方案:使用锁机制解决该问题

强化学习:双Q学习算法

巧了我就是萌 提交于 2020-01-21 04:50:03
双Q学习算法 vs Q学习算法 问题提出 如图所示,这个MDP有两个非终止节点A和B,每幕都从A开始并选择向左或者向右。选择向右会立刻转移到终止状态并得到值为0的回报,选择向左则会到达节点B且得到值为0的回报。B状态下有很多种可能的动作,每种动作选择后都会从一个均值为-0.1、方差为1.0的正太分布中得到一个回报,然后到达终止状态。 我们的目的是分别用Q学习和双Q学习算法实现这个MDP过程,并设置参数记录在多次循环后该MDP过程在每幕中选择向左的概率,以比较两种算法的最大化偏差,进而比较两种算法的优劣。 问题解决 状态A有两个动作:left:0、 right:1 状态B设置有4个动作:0, 1, 2, 3;选择任何一个动作都会到达终止状态。 状态C(终止状态)一个动作:0;用来更新Q(s,a),此状态下终止MDP,不会选择动作。 Q(s,a)代表Q学习算法的状态-动作值函数;Q1(s,a)和Q2(s,a)代表双Q学习的状态-动作值函数。两者的初始化同上一篇博客的问题解决里的内容类似,不赘述。 其它参数:alpha:0.1,gamma: 1,epsilon: 0.1 算法 给出双Q学习的算法,Q学习算法上一篇博客已给出。 程序 由于程序较长,只给出与双Q学习算法有关的程序代码。注释写的也蛮清晰的。 ''' 函数功能:双Q学习算法动作选择策略 输入:state、epsilon 输出