<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Neil的博客]]></title><description><![CDATA[我庆幸，我正在做我最喜欢的事]]></description><link>https://blog.youkuaiyun.com/NeilHappy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; NeilHappy]]></copyright><item><title><![CDATA[猜你喜欢-----推荐系统原理介绍]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/46764519</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/46764519</guid><author>NeilHappy</author><pubDate>Sun, 05 Jul 2015 18:08:37 +0800</pubDate><description><![CDATA[写在正文之前

 

最近在做推荐系统，在项目组内做了一个分享。今天有些时间，就将逻辑梳理一遍，将ppt内容用文字沉淀下来，便于接下来对推荐系统的进一步研究。推荐系统确实是极度复杂，要走的路还很长。

 

A First Glance

 



 

为什么需要推荐系统——信息过载

 

随着互联网行业的井喷式发展，获取信息的方式越来越多，人们从主动获]]></description><category></category></item><item><title><![CDATA[万剑归宗—架构设计中的抽象思维与具象思维]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/46493521</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/46493521</guid><author>NeilHappy</author><pubDate>Sun, 14 Jun 2015 19:34:48 +0800</pubDate><description><![CDATA[新项目上线，用户量不断增加，工作中继续不断发现问题，解决问题。花一点时间来总结一下自己对架构设计的理解。

 

小小的打个广告。这篇文章是发布在neil的微信公众号上。neil的文章都会第一时间发布在微信公众号上。欢迎小伙伴们关注。

                      

微信公众号：互联网与作曲家 



 

 


武侠小说中的“万剑归宗”---]]></description><category></category></item><item><title><![CDATA[写给程序员的心理学入门知识(一)]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/45167627</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/45167627</guid><author>NeilHappy</author><pubDate>Tue, 21 Apr 2015 10:55:51 +0800</pubDate><description><![CDATA[正文之前


neil是14年毕业的一枚后台开发，在大学的时候除了钻研技术外，还喜欢看一些其他领域的书籍。作为工科学生，我们都很擅长逻辑思维。但作为社会人，工作和生活中不可避免地需要跟很多人打交道，学点简单的心理学大有裨益。其实在我看来，心理学等很多社会科学的知识在本质上都是逻辑，只是换了一种思维方式而已。所以，对于我们工科生来说，学一些入门的心理学常识是没任何难度的。]]></description><category></category></item><item><title><![CDATA[用递归方法对二叉树进行层次遍历]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8758259</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8758259</guid><author>NeilHappy</author><pubDate>Thu, 04 Apr 2013 08:57:30 +0800</pubDate><description><![CDATA[在这里看到了这个题。层次遍历是用队列，一级一级地入队列然后输出。而用递归的话，我首先想到是用两个栈来模拟队列，在递归遍历二叉树的过程中入栈，然后最后一次性出栈。但仔细思考后发现无法做到层次遍历。在这里看到了正确的方法。

     主要代码如下:


 1 void PrintNodeAtLevel(BiTree T,int level)
 2 {
 3     // 空树或层级不合理]]></description><category></category></item><item><title><![CDATA[C/C++内存管理 笔记]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8739018</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8739018</guid><author>NeilHappy</author><pubDate>Sat, 30 Mar 2013 08:51:49 +0800</pubDate><description><![CDATA[内存管理是个比较复杂的东西，我这里记录一些比较重要的笔记。

     0.永远保持谦虚的态度来使用指针和操作内存。

     1.在用free释放内存后，要记得将指针赋值为NULL,防止产生"野指针"。

     2.尽量不要用指针指向常量字符串。看一个小例子:

char *p="abcde";
p[0]='m';
std::cout


     用gcc编译会出现]]></description><category></category></item><item><title><![CDATA[二叉树的非递归遍历-----2013年3月20日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8697395</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8697395</guid><author>NeilHappy</author><pubDate>Wed, 20 Mar 2013 17:03:43 +0800</pubDate><description><![CDATA[二叉树的递归遍历算法非常漂亮和易读，但是非递归算法就没那么容易懂了，尤其是后序遍历的非递归算法。
一. 前序遍历

      


 1 void PreOrderTraverse(Node *root)
 2 {
 3     stack ns;
 4     Node *n=root;
 5     while(n!=NULL || !ns.empty())
 6     {]]></description><category></category></item><item><title><![CDATA[僵尸进程]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8665140</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8665140</guid><author>NeilHappy</author><pubDate>Tue, 12 Mar 2013 18:59:12 +0800</pubDate><description><![CDATA[僵尸进程就是父进程fork之后并没有wait子进程。在子进程退出的时候，内核释放该进程所有的资源，比如文件描述符，内存，等等，但是依然为该进程保留一定的信息，只有该进程的父进程wait之后才会释放掉这些保留的信息。如果父进程没有wait，那么子进程就变成了僵尸进程。在高并发的服务器中，僵尸进程会有很大的危害。如果僵尸进程过多，那么就会有大量的进程号被僵尸进程占用，但是系统所能使用的进程是有限的。如]]></description><category></category></item><item><title><![CDATA[无限式查找-----2013年2月28日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8621088</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8621088</guid><author>NeilHappy</author><pubDate>Thu, 28 Feb 2013 11:01:29 +0800</pubDate><description><![CDATA[问题描述:已知一个数组x[]，元素个数有多少并不很清楚，但是数组元素已经依顺序从小到大排好，而且在数组最后添加了足够多的MAX记号;MAX表示最大的值，比数组中每一个元素都大，而且个数足够多。编写一个程序，在这个数组中找出某个给定的值。

      思路:二分查找法是一个非常高效的算法，但要想使用二分查找法，必须满足2个条件:1.元素是有序的，可以从小到大排列，也可以从大到小排列。2.知道元]]></description><category></category></item><item><title><![CDATA[寻找固定的和----2013年2月26日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8612578</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8612578</guid><author>NeilHappy</author><pubDate>Tue, 26 Feb 2013 10:25:51 +0800</pubDate><description><![CDATA[问题描述:有两个数组x[]与y[]，各有m与n个元素，而且各个元素没有依顺序排列；d是一个已知的值。请写一个程序，看看在x[]与y[]中有没有满足x[i]+y[j]=d的元素。例如，若x[]为3,7,2,4,y[]为1,5,2,3,d为9；那么x[1]+y[2]与x[3]+y[1]都合乎条件，也即都是9。

     思路:x[i]+y[j]=d。那么x[i]=d-y[j]了。将x[]数组按从]]></description><category></category></item><item><title><![CDATA[寻找脚码----2013年2月24日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8606765</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8606765</guid><author>NeilHappy</author><pubDate>Sun, 24 Feb 2013 13:22:07 +0800</pubDate><description><![CDATA[题目来自:《C语言精选名题百则技巧篇》

     问题描述:已知一个整数数组x[],其中的元素彼此都不相同，而且也已经从小到大排列好。请用比较大小，相等的方式编写一个程序，找出给定的数组中是否有一个元素满足x[i]==i(注意:在代码中是从0开始索引的，也就是x[0]是第一个数，所以对应于代码也就是x[i]==i+1)的关系。举例而言，如果x[]={-2,-1,3,7,8},x[3]=3,因]]></description><category></category></item><item><title><![CDATA[找出没有相邻的1的二进制数的个数---2013年2月17日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8584695</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8584695</guid><author>NeilHappy</author><pubDate>Sun, 17 Feb 2013 12:45:17 +0800</pubDate><description><![CDATA[问题描述:用G(n)表示在有n位的二进制数中没有相邻的两个1的二进制数个数。比如，当n=3时，000，001，010，011，100，101，110，111这8个数中只有000,001,010,100,101这5个是没有相邻为1的，故G(3)=5。请写一个程序，输出G(n)的值。

      错误的思路(考虑的不周全):采用"分治"的方法，比如n=3，每次都将处理原问题规模的二分之一，直到n]]></description><category></category></item><item><title><![CDATA[busybox源码剖析(3)---cat.c]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8581396</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8581396</guid><author>NeilHappy</author><pubDate>Fri, 15 Feb 2013 12:20:41 +0800</pubDate><description><![CDATA[cat显示一个文件的内容。需要注意的是，cat并不能处理目录。


 1 extern int cat_main(int argc, char **argv)
 2 {
 3     int status = EXIT_SUCCESS;
 4 
 5     if (argc == 1) {
 6         print_file(stdin);
 7         return st]]></description><category></category></item><item><title><![CDATA[busybox源码剖析(2)---pwd.c]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8581275</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8581275</guid><author>NeilHappy</author><pubDate>Fri, 15 Feb 2013 11:03:08 +0800</pubDate><description><![CDATA[pwd命令是列出当前的路径。


 1 extern int pwd_main(int argc, char **argv)
 2 {
 3     static char *buf; 
 4     
 5     buf = xgetcwd(buf);
 6     
 7     if (buf != NULL) {
 8         puts(buf);
 9         r]]></description><category></category></item><item><title><![CDATA[整数的所有不同分割数目--非递归算法]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8581253</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8581253</guid><author>NeilHappy</author><pubDate>Fri, 15 Feb 2013 10:45:33 +0800</pubDate><description><![CDATA[递归算法见：整数的所有不同分割数目--递归算法

     思路:非递归与递归的思维顺序是互逆的，所以很容易写出以下代码。






 1 #include 
 2 #define MAX 1000
 3 
 4 int p[MAX][MAX]={0};
 5 
 6 int main()
 7 {
 8     int n=2;    
 9     int index_n,]]></description><category></category></item><item><title><![CDATA[整数的所有不同分割数目----2013年2月15日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8581214</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8581214</guid><author>NeilHappy</author><pubDate>Fri, 15 Feb 2013 09:51:21 +0800</pubDate><description><![CDATA[问题描述:把一个正整数写成若干个正整数的和。比如4=3+1，2+2，2+1+1，1+1+1+1，再加上自己，就一共有5种分割方式。

     思路:求解4的所有分割方式，实际上就是求分割中以4为最大值而且和为4的所有分割方式，可以用p[4][4]来表示。抽象出来，就是p[n][m],表示分割中以m为最大值而且和为n的所有分割方式。那么，就有以下几种情况。

     1.第一步当然是n=]]></description><category></category></item><item><title><![CDATA[busybox源码剖析(1)---whoami.c]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8580984</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8580984</guid><author>NeilHappy</author><pubDate>Thu, 14 Feb 2013 21:42:59 +0800</pubDate><description><![CDATA[想找个简单的代码来看，学习代码的架构设计，就找到了busybox。先从最早的版本开始看。

     whoami命令是获取当前终端的用户名。/etc/passwd文件存储了所有用户名的清单。要注意的是/etc存储的配置文件大多是系统级的配置文件。而whoami想要达到目的，就需要与/etc/passwd文件打交道。

     首先来看whoami.c的主体程序:


 1 ext]]></description><category></category></item><item><title><![CDATA[集合的所有分割方式---2013年1月28日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8548486</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8548486</guid><author>NeilHappy</author><pubDate>Mon, 28 Jan 2013 12:58:33 +0800</pubDate><description><![CDATA[问题描述:分割集合成多个子集合，这几个子集合间没有交集且他们的并集是原集合。

       思路:将包含n个元素的集合set的分割表示为n个数字。比如set[]={1,2,3,4}，那么{1,2},{3,4}就可以表示为1122,这4个数分别表示set[0]在第一个分割集合,set[1]在第一个分割集合，set[2]在第二个分割集合，set[3]在第二个分割集合。将这个过程称为编码。]]></description><category></category></item><item><title><![CDATA[递归统计项目中的非空白代码行数]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8545035</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8545035</guid><author>NeilHappy</author><pubDate>Sat, 26 Jan 2013 17:59:50 +0800</pubDate><description><![CDATA[在准备阅读一个开源项目的代码前，可以大约看看整个项目共有多少代码，估计项目的规模。我就写了一个简单的程序来达到此目的，其中的一些代码参考了apue中的代码。

      代码如下:

View
 Code


  1 //程序功能:统计一个文件夹(一个项目)中所有文件的有效代码行数(除去空白行)。
  2 
  3 #include 
  4 #include 
  5 #inc]]></description><category></category></item><item><title><![CDATA[列出所有K个元素的子集-----2013年1月26日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8543918</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8543918</guid><author>NeilHappy</author><pubDate>Sat, 26 Jan 2013 09:16:30 +0800</pubDate><description><![CDATA[问题描述:列出一个集合的元素个数为k的所有子集。

      思路:在字典顺序列出所有子集的基础上判断元素个数就可以了，比较简单。代码如下:


 1 #include 
 2 #define MAX  1000
 3 
 4 int main()
 5 {
 6     int n=5;
 7     int set[MAX]={1};
 8     int index=0;
 9]]></description><category></category></item><item><title><![CDATA[产生所有排列---字典顺序-----2013年1月23日]]></title><link>https://blog.youkuaiyun.com/NeilHappy/article/details/8535544</link><guid>https://blog.youkuaiyun.com/NeilHappy/article/details/8535544</guid><author>NeilHappy</author><pubDate>Wed, 23 Jan 2013 20:01:36 +0800</pubDate><description><![CDATA[问题描述:以字典顺序产生所有排列。假定集合set是连续的并且按从小到大顺序排列好了的，并且有n个元素。

       思路:算法的思路分成两个部分:A是递归产生以某个数字开头的排列，B是调用A来依次生成  1为第一位的所有排列，2为第一位的所有排列，....n为第一位的所有排列。

       下面是A部分的详细思路:

        1.以1234为例子。从右到左来寻找 (j=]]></description><category></category></item></channel></rss>