- 博客(370)
- 收藏
- 关注
原创 用Netty实现Redis(2)
这是一个用Netty实现的,支持多线程和异步调用,lock-free 的JavaRedis client客户端(服务器版本:https://blog.csdn.net/pp634077956/article/details/82178710)github: https://github.com/pyb1993/JavaRedisClient目的1 配合JavaRedis服务器进行调...
2018-08-29 10:08:56 1164
原创 用Netty实现Redis
这是一个用Netty实现的Redis(服务器版本)github地址:https://github.com/pyb1993/JavaRedis目的有三:深入理解redis,将redis上的各种功能慢慢迁移到java上来 用C语言来实现太麻烦了,而且一般工作中用不到C,加上我前两个项目(编译器和http服务器)都是用c写的,正好练习一下Java 降低开发难度,对于一些功能可以更轻松的...
2018-08-29 10:03:40 4809 1
原创 麻将胡牌判定的判定算法
麻将胡牌判定的判定算法问题背景 :简化了麻将规则,给定[1s-9s],[1b-9b],[1t-9t]一共27种牌,每种牌都有4张。需要判断给定的牌是不是胡牌。胡牌的定义为:14张牌里面由一个对子,四个坎组成。其中对子代表两张一样的牌,坎代表三张一样的牌,或者三张连续的牌(连续指: 1s,2s,3s | 4t,5t,6t) 举例:1s,1s,2t,3t,4
2018-01-13 23:39:36 7756 2
原创 关于eventmachine,协程在rails里面的使用
最近在公司实习的时候一直在学习rails和ruby.在实现一个小需求,从微信的接口拉取粉丝信息然后更新我们的数据库,这是一个不太常用的功能,很久才会跑一次.但是rails的模式,如果作为普通的客户端来发需求,而且同时发送的请求不可以太多,否则会出错(估计是微信的限制),ruby的httprequest是阻塞操作,一次只会发送一个请求,我查阅资料并且求教一番之后有如下几种可行的思路.####1.可以用
2017-07-20 20:19:10 667
原创 单词纠错APP
设计思路:(1)我们首先需要提出一个指标来衡量单词的相似程度,利用编辑距离,即字符串A经过插入,删除,改变三个操作变成字符串B需要花费的最少操作次数,利用动态规划即可解决.(2)如何高效找出候选单词呢,建立字典树然后遍历比较是可以的,但是在单词数量大的时候效率很低。利用BK树可以避免大量的不必要比较,简单来说,A->B+B->C的距离一定大于等于A->C的距离,它满足三角不等式,由此可以推导出两边之
2017-04-23 20:40:01 1052
原创 SIMD小测试
今天研究了一下SIMD指令,做了一个小测试,发现速度变快了5倍,但是在release模式下编译器会做同样的优化。所以很多时候我们可以不需要手动的写SIMD.当然编译器不一定会做这样的优化。另外注意64位系统上new自动16位对齐,但是用int[]这样的办法就会导致内存越界,因为栈上的内存不一定是16位对齐的。除此之外发现了一个直接修改原来数据的办法,就是将原来的地址强制转换成__m128i,这样修改
2017-04-08 10:25:24 857
原创 leetcode之N点成线问题
下面的代码没有精炼过,就写的比较罗嗦了。平面上任意N点,其中一条直线最多过几个点,这个题显然有O(n^2)的解法,关键的一点是一定要注意cornercase,比较多,我试了7,8次才过….首先考虑相同的点,这个要单独列出来,其次考虑不能用double表示斜率,用一个pair表示分数既可,所以要写gcd来化简,然后注意这里面有负数,所以进行构造的时候要定序,(1,-1),(-1,1)都要变成(-1,1
2017-04-03 09:00:28 765
原创 网易笔试的两道dp问题
#include "iostream"#include "vector"#include "algorithm"#include "string"#include "cmath"using namespace std;int main(void){ int n; string k; while (cin >> k) { cin >> n;
2017-03-29 18:51:18 573
原创 高效大整数运算库-------An Efficient Library for BigInteger
———-高效的高精度大整数库———-————-本着锻炼一下编程和优化能力的目的,花了两个多星期完成了这个作品。具体的性能比较可以参考这个:性能比较0. 其实在1年多前刚刚开始学习C++的时候也曾经做过一个用字符串来表示大整数的练习,但是运行速度很慢,所以我首先将原来的代码翻了出来看了看,首先把所有的参数改成const &的类型,当时写的时候还不知道引用….所以结果就快了几倍。然后发现了karat
2017-03-23 16:53:00 2674 3
原创 简单五子棋AI
五子棋AI这个项目参考了网上的五子棋源码,并且做出了自己的修改与一定的优化。基本思路:首先我们知道棋类AI的基本框架就是博弈树,使用最大最小搜索算法和alpha/beta剪枝。这是基本的框架。然后因为存在的解太多,所以我们需要考虑一个评估函数来进行选择。[1]评估:这里主要采用状态分析的办法来进行打分。我们首先统计所有的棋形状态(冲二,冲三,活三等等),然后根据双方的状态来打分:具体来说,就是轮到我
2017-02-23 18:16:47 1353
原创 C++项目:Json_parser
我的json parser/generator我的json parsergenerator- 功能简介1 解析器部分2 生成器部分3 测试部分- 部分实现1整体框架1json_value可能代表6个类型中的一种2json_tree执行具体的解析2 Literalnullfalsetrue3 Number的解析1首先我们了解number的格式以及错误输入2解析4 string
2017-02-01 18:35:10 4440 1
原创 关于关系型数据库表的设计
这篇文章主要是总结一下看书的收获,至于具体的实例,可能等到以后工作了才能给出吧,最近没遇到什么数据库的问题。表的设计最基本的就是要满足一些范式,所谓范式,可以理解为对设计标准的满足程度。我暂时只学习了三个范式。[0]:第一范式:一张表必须要使得每一列都满足原子性才能满足第一范式(其实还必须有主键,但是这个太基本了)。什么叫做原子性,个人认为可以理解成一个属性还能不能继续分割的程度。而原子性在表中又体
2017-01-16 22:34:37 652
原创 判定一个点是否在三角形内部
给定任意一个点的坐标和一个三角形,判定这个点是否在三角形内部。本文独立思考完成,没有参考别的资料,可能方法不是太简洁。基本思路:[0]:考虑点在三角形内部的特征:任何一条经过该点的直线都一定会和这个三角形有交点,也就是会与某些边有交点。考虑这样的直线的特殊情况使得经过外部的点的直线和三角形没有交点。容易联想到党该直线平行于某一条边的时候,这样的直线一定会与三角形没有交点(可以将三角形外部的平面划分为
2017-01-09 15:37:34 1371
原创 三角形填充和分形练习
画出一个六角星,在六角星的两条边上的三等分点作一个新的等边三角形,然后递归的做下去,并且图形的内部必须填充颜色。[0]:首先考虑如何画出一个六角星,基本方法是:先画一个三角形,然后对每一条边的两个三等分点求出第三个顶点,这样以新的三个点作一个三角形和原来的三角形合成在一起就得到了六角星。[1]:接下来考虑如何对每一个小的三角形进行分形:我们以一个三角形的三个顶点作为参数,我们只需要其中的两条边(每条
2017-01-09 13:51:54 1428
原创 遗传算法的入门实现(2):利用正方形拼接firefox
这段程序没有参考网上的任何代码,属于自己独立完成,因此效果也不是很理想。但是不管怎样,我也花了不少心思研究,就当是述说一下自己的思路吧:(1)(1)首先为什么不用三角形来进行填充呢?因为三角形的绘制和填充本身来说不是一件很容易的事情(对于我来说,虽然我参考了一下网上的算法,已经有了基本的思路,但是还是把精力放在遗传算法上面是重点),而使用正方形则很大的减少了编程的难度。(2)(2)其次在染色体的选取
2016-12-04 20:15:39 4144
原创 遗传算法的简单实现(1):求解函数最大值
刚刚了解了一点遗传算法的原理,参照了网上的一篇入门教程自己实现了一下。参数和操作:参数和操作:染色体(表示方法),染色体长度,变异率,交叉率,最大的总群个体数,评估函数,目标函数(在这里与评估函数一致)。对函数对函数搜索最大值。实现思路:将染色体表示为x,y的值(以bit的形式来表示),进行选择,交叉,变异。同时为了保证解具有较好的全局性,我们每次都选择最好的一个解来替代下一代的最差的一个解,同时提
2016-12-03 16:21:21 12937 2
原创 基于模型融合的推荐系统实现(3):模型融合
基本思路很简单,最小二乘法就好了:我们假设两个算法得到的结果权重分别是a,b利用最小二乘法和我们分出来的第二部分数据就可以获取a,b使得误差最小。其实最小二乘法就是求一个广义的逆即可。最后的RMSE比起单一的模型有所提高,变成了(0.86~~~~)import numpy as npfrom code import read_filefrom SVD import construct_matri
2016-11-29 19:19:21 2441 3
原创 基于模型融合的推荐系统实现(2):迭代式SVD分解
SVD算法的原理网络上也有很多,不再细说了,关键是我们得到的数据是不完整的数据,所以要算SVD就必须做一次矩阵补全。补全的方式有很多,这里推荐使用均值补全的方法(用每一行均值和每一列均值的平均来代替空白处),然后可以计算SVD,作PCA分析,然后就可以得到预测结果。但是我们这里有一个极为关键的思路,迭代是SVD,我们用第一次预测得到的SVD的值来原来的均值预测,然后继续做SVD分解,直到收敛。这里的
2016-11-29 19:11:42 1958
原创 基于模型融合的推荐系统实现(1):基于SGD的PMF
(1)PMF算法PMF的基本的思路,就是定义两个基本的参数W,U,然后对于任意一个组合(u,m),利用Wi∗UjW^i*U^j,来获取预测值。这些基本的算法思路网上很多,就不细说了。简单说一下程序[0]:一开始我们要将训练数据划分为3部分,第一部分用来做普通的SGD训练,第二部分用来训练模型融合,第三部分用来测试RMSE。[1]:我们利用SGD(随机梯度下降)来训练函数,最后就可以得到W,U,为了更
2016-11-29 19:03:37 2057
原创 筛选平方因子
给定范围[m,n],求出里面所有不含完全平方数因子的数!解析:首先筛出所有2到m−−√2到\sqrt{m}的素数p,然后对每一个P2P^2的倍数进行标记(代表删除),最后没有标记的就是我们需要的数。def erase(m): p = [] vis = set() for i in range(2,m+1): if i in vis:continue
2016-11-26 21:51:29 702
原创 python实现二十四点
给定n个数字,计算出一个满足24点的表达式:比如1,11,2,1:(11+1)*2/1基本思路就是枚举计算顺序(在一开始进行一次全排列),括号,加减乘除。其实有很多是重复计算过了的。这个程序我为了高效找到一个解就算了,但是我们可以找到所有的解(表达顺序可能会重复,比如1+2和2+1),同时也可以计算多个数字的组合。def compute(x,y,op): if op=='+':return
2016-11-26 20:29:06 13080 3
原创 CSAPP第十二章读书笔记
这一章讲了并行的三种机制:[1]基于进程的并行:[2]基于I/O多路复用的并行:基本思路是使用select函数,使得内核挂起进程,只有某一个I/O或者多个I/O事件发生之后,才会将内核返回给应用程序。[3]基于线程的并行:在这里还引入了信号量和锁的机制,我们利用信号量进行对共享资源的保护:互斥。还可以利用信号量来调度共享资源,比如消费者,生产者,读-写这种模型。利用缓冲区,我们可以将一个web服务器
2016-11-23 12:39:20 554
原创 Uva1609:Boring的序列(有相当难度的好题!)
这道题的意思是:给定一个序列,如果任意字序列里面都有至少一个不重复的元素(不重复相对于子序列),那么我们就叫这个序列是不无聊的。我们需要检测一个序列是否满足这种性质。这道题首先是有O(n^2)的解法的,枚举任意子区间然后判断,但是判断这个操作为O(n),我们需要将其降为O(1).方法是用滑动窗口来维护信息,并且时刻维护不重复元素的数量。当然这种方法很直观,但是效率太低。考虑有没有O(NlogN)的算
2016-11-22 10:08:19 922
原创 CPS变换的简单理解
CPS变换又叫做continuation Passing Style,它是一种编程风格,用来将内部要执行的逻辑封装到一个函数里面,然后再返回给调用者,这就将它的程序流程显式的暴露给了程序员,让我们可以控制它。我们先看一个cps变换的小例子:import tracebackdef disp(x): if x>0:disp(x-1) else:print((len(traceback.
2016-11-21 12:34:32 11379
原创 AdaBoost算法的单机实现
AI课上的作业,我用python实现一下实现的目标如下:首先简单介绍一下Adaboost算法,也叫做自增强适应。用来将多个弱的分类器/预测器变成一个比较强的分类器。具体算法如下:[0]弱分类器我只实现了简单的二分类,然后用AdaBoost算法将这些分类器训练成一个强分类器。[1]强分类器由多个弱分类器加权之后结合而成,每一个弱分类器则有自己的判别规则。这里简单起见只用了最最简单的水平|垂直分类器。[
2016-11-20 14:47:19 578
原创 删除子序列问题
给定一个序列,要求从里面删除一个连续的子序列,使得剩下的序列里含有一个最长的连续递增子序列。这个题目有O(nlogn)的解法,但是比较复杂,我也没有研究清楚,就先说O(n^2)的算法吧:最容易想到的是枚举算法(i,j),然后检测能够拼接的最长子序列。当然检测这个步骤需要O(n),我们有两种方式来解决这个问题.(1)预处理计算出所有的f(i),g(i),f(i)代表以第i个元素开始的递增序列,g(i)
2016-11-19 19:26:42 3081 1
原创 滑动窗口问题
给定一个序列,求出一个字序列ALAR没有重复的值。这个题目看似非常简单,但是却很经典,值得反复捉摸。首先,最简单的办法就是用一个大小为k(k从大到小,发现符合条件的就可以停了)的窗口开始扫描,O(n^2)可以解决。左出右进。但是这个效率还是太低了。其实我们可以对比一下leecode上的最大长方形问题,有没有发现有一点相似呢,我们也是不断拓展右边界(只要可以递增),如果不能拓展了,就“滑动窗口”使得最
2016-11-18 22:42:58 3826
原创 CSAPP学习笔记第9章:
每一个进程需要属于自己的程序代码和变量,但是如果进程太多那么需要的内存也太多,可能导致一些进程没有办法运行。当一个程序没有空间可用的时候,它可能会写到别的进程的存储器里面,这样会带来很难离解的错误!为了方便管理存储器(内存),操作系统提供了这样一个抽象:虚拟存储器,它将主存作为磁盘的缓存,并且为每一个单独的进程都提供了统一的虚拟地址.保护了存储器不会受到破坏.[1]虚拟地址和物理地址,每一个程序里面
2016-11-18 14:30:21 3065
原创 猜测多项式
在知乎上看到这样一个问题,非常有趣,记录下来:假设现在有一个黑盒子,里面有一个多项式,每一个多项式都是正整数,我们每次往这个黑盒子里面输入一个正整数x,它就会返回一个带入x的结果,那么请问输入几次可以得到所有多项式系数呢?开始我是没有做出来的,我尝试带入1和-1,0之类的数然后看能不能建立方程组消元。结果当然失败了。但是我看到了一个提示:答案是2次。那意味着这道题目绝对有很巧妙的解法,使得两次获取的
2016-11-18 09:14:30 2226
原创 数组排列
给定一个整数数组,求该数组的一个排列使得排列之后的数最大:比如[1,3,22,9]=>93221这个问题看似简单,但是要优雅的解决却并不容易.我只找到了dfs的办法进行计算,每次找到首位数最大的一个数字集合,然后枚举其中一个作为当前的位置的元素,然后递归的搜索下去。但是这样的复杂度是很高的。我们来看一下另外一个优雅的解法:定义a>b等价于ab>ba定义a>b等价于ab>ba,然后排序之后的结果即为答
2016-11-17 17:32:00 2358
原创 将整数数组进行m等分,使得每一个部分的和相等且m最大
我对这个问题的解法是递归着解决的,首先对原始数组进行排序,然后我们首先选择m的大小,注意这里题目没有说明是否是正整数,如果是:那么最大的m一定小于(数组的和)/(数组最大的元素),否则就要从数组的元素个数开始枚举:假设sum是数组元素和,我们首先判断m是不是可以被sum整除,如果不是,跳过.否则可以开始判断m到底能不能等分。我们对问题进行分解:[1]我们可以首先求出一个数组的子集使得它满足和为sum
2016-11-17 17:13:04 5589
原创 Python Challenge 0-9
这是一个神奇的网站….现在卡在第七题还没有做出来。。。(0)(0):较简单,首先尝试了238发现不对,然后尝试2^38次方即可成功跳转url.(1)(1):题目是这样:很容易想到将每个字母往后推2个,然后将下面哪一句话转换一下即可发现并不是答案而是让你对url进行decode,对url里面的map做一点微小的工作即可pass。(2):(2):如果不告诉你source page还是有点难想到,但是说了
2016-11-13 15:10:21 2093
原创 CSAPP第八章:读书笔记
[1][1]前面讲了异常流的处理。[2][2]进程的概念,fork()一次,返回两次。子进程返回的是0,父进程返回的是子进程的pid。看一个例子:很明显子进程会输出x=2,x=0,而父进程则会输出x=0.[3][3]waitid,用来挂起指定进程直到该进程返回:如果指定的pid=-1,那么则指定进程是当前所有进程的子进程。看一个例子:很明显这里有三种输出:bacc,abcc,acbc.书上答案有误。
2016-11-08 14:06:58 3011
原创 CSAPP读书笔记第七章:(变量作用域与链接器)
[1]程序经过预处理和编译之后变成可重定位目标文件。每一个可重定位目标文件都有一个表,这个表含有当前文件定义的变量(函数),引用的函数。这些变量有几种类型:(1)当前模块定义的全局变量(非static)(2)当前模块定义全局变量(非static)(3)非当前模块定义的但是却被当前模块引用。所有的局部变量都是不被连接器care的。[2]当有多个文件的时候,每一个Global变量都是全局可见的。所以如果
2016-11-06 16:14:25 3096
原创 最大公约数和快速gcd
最大公约数有两种基本的求法:(1)辗转相除法(2)更相减损法,首先来证明一下:(1)证明gcd(a,b)=gcd(b,a(1)证明gcd(a,b) = gcd(b,a%b)假设a=k1m,b=k2m,a=sb+r假设a = k_1m,b = k_2m,a = sb+r可以知道r=a−sb=(k1−sk2)m,所以m是(b,r)的公约数可以知道r = a-sb = (k_1-sk_2)m,所以m是(b
2016-11-01 15:40:16 3290
原创 Maigc Cubes:2017 Works Application笔试
给定一个M*M*M的魔方,和N个小魔方,将每一个小魔方融合到大魔方里(小魔方的大小不确定,但是一定小于大魔方),融合的部位将将加起来再对P取余,要求最后的结果一定是全部为0。求出所有小魔方的位置。思路如下,这个题目似乎没有找到巧妙的解法,所以采用暴力搜索.但是搜索也是有技巧的,我思考之后发现:这个问题很适合双向BFS搜索加减枝。从最终状态全0出发,我们可以每次减去一个魔方的值然后取余(-1%3 =
2016-10-31 11:00:11 2080
原创 CSAPP读书笔记第六章(优化cache命中率)
(1)局部性:(1)局部性:程序具有时间局部性和空间局部性.时间局部性是指当前用的存储器位置可能在不久的将来被用到,会被放入告诉缓存。空间局部性则是指一个存储器位置被用到,那么相邻的几个位置在不久的将来也可能被用到,也会被放入告诉缓存!根据我在vs2013的测试,发现sum函数要比sum2快几十倍的速度,这完全得益于我们按照行来访问,这天然的符合vector的存储方式,另外在release情况下编译
2016-10-26 22:05:38 5656
原创 Csapp读书笔记:第五章
(1)(1)安全优化,编译器在进行优化的时候必须考虑所有的情况,只执行安全的优化。所以可能会限制很多可能的优化策略。如果写出上面这样的代码,当xp==yp的时候,最后的结果等于0。否则xp和yp指向的对象进行了一次交换。由于有两种可能的情况,限制了编译器可能进行的优化.另外函数的调用改变了全局变量也可能造成优化限制。使用内联函数可能可以避免这种限制,有些编译器在较高的优化级别也可能会进行内联函数替换
2016-10-25 14:09:16 4008
原创 Python建立简易语音识别系统
将AI课上学习的知识进行简单的整理,可以识别简单的0-9的单个语音。基本方法就是利用库函数提取mfcc,然后计算误差矩阵,再利用动态规划计算累积矩阵。并且限制了匹配路径的范围。具体的技术网上很多,不再细谈。现有缺点就是输入的语音长度都是1s,如果不固定长度则识别效果变差。改进思路是提取有效语音部分。但是该部分尚未完全做好,只写了一个原形函数,尚未完善。 import waveimport num
2016-10-24 22:55:51 35447 5
原创 关于切割绳子的思考
n个人抢一个一元红包,估计得到最小红包的那个人将有多少钱?这个问题可以转换为类似的问题,将一根绳子分成N段,最短的绳子的期望是多少?
2016-10-22 20:36:43 2386
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人