摘要:这几天不断尝试社交圈子挖掘的算法,不断改进算法,产生了很多的结果。对于我自己的圈子,我人工评价即可知道效果如何,但是如果测试其他人的数据,总是请同学帮忙验证,有些过于麻烦,而且,这样的人工评价,不利于比较。所以,我需要一个相对准确的方法来评价我挖掘出的圈子的效果如何。 我经常听有人说圈子的“准确率”,“召回率”如何如何。但是,我觉得这个也不是很直观,因为这个需要标注数据,来进行测评。那我们能否从网络拓扑结构本身入手,进行判断呢?当然可以,就是:quality function。 这个思路很早就提出来了。要分析这个思路,还要先说说社团结构的定义。对于社团结构,一直没有很好的定义,尤其是量化的定义
阅读全文
摘要:我很喜欢《亮剑》这部电视剧,李云龙经常说:我们不能打了半天,不知道敌人是谁。所以 ,这一篇文章,我简单分析一下,微博社交圈子挖掘目前遇到的问题是什么?不能分析了半天,只注重结果如何如何,却忘记了最根本的问题、难题是什么。 复杂网络中社团结构发现的研究已经有好多年了,有分裂的方法,凝聚的方法,基于网络动力学的方法,还有很多别的奇怪的方法。这些方法都有各自适应的解决的网络结构。比如前一篇博客中提到的两点:层次性重叠性一些方法层次性处理的很好,如GN,Newman‘s fast algorithm等,有些重叠性处理的非常好,如k-clique方法比较典型。后来,研究人员相继提出一些方法,将上面的两个
阅读全文
摘要:微博构成了一个社交网络,链接非常复杂,学术一点说叫做复杂网络。在社交网络中发现圈子,其实就是在复杂网络中发现社团结构,有很多方法可以依循。但是目前这些方法,都有各自的优缺点,没有相对完美的算法。从今天开始尝试学习、分析这些算法的特点,并且希望能够进行不遗余力的改进。 在一个复杂的社交网络中,有两个特点,首先要很清楚,才能够判断挖掘的圈子是否合理,是否贴合实际:层次性:在社交网络中,圈子、或者社团结构,往往都是可以分为子圈子、子社团结构的,可能是由于选取某系的某种不同程度。重叠性:由于人的多面的属性,在实际的社交网络中,圈子往往是重叠的。根据以上两个重要的特点,分别有比较典型的代表算法:Newm
阅读全文
摘要:今天在一个博客中看到一个程序,使用mapped file机制,创建超大的矩阵,主要是为了节省内存,避免内存溢出异常。主要代码如下:/** * */package high.performace.java;import java.io.Closeable;import java.io.IOException;import java.io.RandomAccessFile;import java.n...
阅读全文
摘要:看了几篇文章介绍高性能java程序开发的,主要是关于采用一些什么样的方法,能够较大的提升java程序的性能,主要有以下几点: 使用unsafe的类,去掉一些不必要的检查。这部分我平时没有使用,需要进一步研究 尽可能少的使用内存,比如对于基础类型的集合,可以采用Trove工具包。 java中默认的String的实现性能比较低,是基于char[],java 6之后,使用-XX:+UseCompress...
阅读全文
摘要:ubuntu下,适用eclipse开发c++程序,经常会需要连接外部的库,主要有两种方法: 直接修改Debug/objects.mk: 修改如下:LIBS := -lxapian 右键项目->peoperties->c/c++ Build->Settings->Tool Settings->GCC C++ Linkder->Libraries。在上面的Libraries(-l)中添加,比如我要添加...
阅读全文
摘要:打算将一篇论文中的存储引擎实现了,java效率相对低,不想用c++,就想到了google开源的go语言。这次是真的有实际需求的学习了。开始安装: 安装c语言工具:gcc,make,awk等,一般默认都安装好了 安装Mercurial,sudo easy_install mercurial, 如果没有安装easy_install,执行:apt-get install python-setuptool...
阅读全文
摘要:笔记都是写给未来的自己看的。Cassandra为什么要有Compaction的机制Cassandra是BigTable的列族(Column Family)存储方式,这是一种非常灵活的存储模型,即使在同一个表中,不同的key也可以有不同的列,而且列不是对齐存储的,节省了空间。在Cassandra中,insert和update在底层都是追加的方式实现的,例如,数据key1对应column1,column2两列,要更新key1数据,更新内容为column2,c0lumn3。column1不变,column2更新,column是新加的。并且由于追加的方式,原数据和更新数据分别在两个sstable文件中
阅读全文
摘要:统计的HDU上的部分动态规划的题目,供自己复习查找,大部分题目的思路、代码会在博客中给出。ID题目状态2955Robberies 1864最大报销额 1231最大连续子序列AC1003Max sumAC1506Largest Rectangle 1505City Game 2602Bone Collector 1087Super JumpingAC2571命运 1069Monkey and Ban...
阅读全文
摘要:找到一个上升子序列,和最大。注意取值可能为负数。#include int n;int a[1001], dp[1001];int main() { while (scanf("%d", &n)) { if (0 == n) break; for (int i = 1; i a[j] && dp[i] m) m = dp[i]; } printf("%d\n", m); } return...
阅读全文
摘要:水题一道,但是论坛中有人说从上往下dp,一定是wa,我两个方向都试过了,全部ac。自底向上dp:#include int c, n;int dp[100][100];int max (int a, int b) { if (a > b) return a; return b;}int main() { scanf("%d", &c); while (c--) { scanf("%d", &n)...
阅读全文
摘要:注意多个测试用例,和poj不一样 注意输出用例结果之间要换行代码如下:#include int rect[101][101];int a[101], dp[101];int n, mx;int main() { while (scanf("%d", &n) != EOF) { for (int i = 1; i dp[k - 1] + a[k]) dp[k] = a[k]; ...
阅读全文
摘要:最长公共子序列问题,经典dp#include #include #include using namespace std;char a[2000], b[2000];int al, bl, m;int dp[2000][2000];int main() { while (cin >> a >> b) { al = strlen(a); bl = strlen(b); bool one = f...
阅读全文
摘要:子序列最大和问题,记录开始结束位置。#include int k, m, st, ed;int a[10001], dp[10001], s[10001], e[10001];int main() { while (scanf("%d", &k), k) { for (int i = 1; i a[i]) { dp[i] = dp[i - 1] + a[i]; s[i] = s[i...
阅读全文
摘要:这是HDU1003题目的扩展,一维扩展到二维。HDU1003解题思路很简单,但是如果要记录起始位置的话,需要额外两个数组。HDU1003中,设dp[i]表示以第i个数结尾的子序列中,和最大的值,状态转移方程为:dp[i] = max(dp[i - 1) + a[i], a[i])刚刚看到POJ1050这个题目,也想着顺着这个思路扩展,但是不得其解,无法构造状态转移方程。后来看了别人的解题报告,才恍...
阅读全文
摘要:今天是元宵节,外面的鞭炮声很大。元宵晚会已经成了那些人的KTV了。我还是总结一下白天的题目好了。POJ1088是一道在二维数组上的最长下降子序列或者最长上升子序列问题。很自然会用h[i][j]来表示到(i,j)位置的最长上升子序列的长度。考虑状态转移方程,与之有关系的是: h[i - 1][j] h[i][j - 1] h[i + 1][j] h[i][j + 1]状态转移方程如下:h[i][j]...
阅读全文
摘要:通过这个题目,对自顶向下分析,有了进一步的理解。题意如下表:Vases(j)12345Bunches(i)1723-5-24162521-410233-215-4-20201,2,3行代表三束花,1,2,3,4,5列代表这么多列的花瓶,要把三束花放到花瓶中,满足一下几个条件: 不同的花要出现在不同的列 j1表示1号花放的列,依次。保证j1<j2<j3 最重要的,要保证三个位置上的数字和最大。分析这...
阅读全文
摘要:这道题目和前面两道是类似的,如果采用相同的方法去解,会出现TLE。前面的方法时间复杂度是O(n^2)的,这道题目,我们要采用的方法是O(nlogn)的。思路想法儿也比较简单,就是在前面方法的基础之上,运用了二分查找。在使用O(n^2)的方法的时候,查找i前边的比它小或者大的时候,是遍历前面每一个元素,并且进行比较。这样,时间复杂度就为O(n^2)。但是,在实现算法的过程中,在计算第i个元素的时候,...
阅读全文
摘要:水题一道,分析方法见前一篇博客。代码如下:#include using namespace std;int a[1001], dp[1001];int main() { int n; while (cin >> n) { for (int i = 1; i > a[i]; int max = 0; for (int i = 1; i max) max = dp[i]; } cout
阅读全文
摘要:题目说了很长,要求最长下降子序列。题目的输入比较奇怪,需要全部读入之后,再进行dp,否则会TLE(这是我看其他同学说的)。这个题目的递归表达形式(正规一点儿应该叫做:状态转移方程,我太土了)---状态转移方程为:dp[i] = dp[j] + 1 (0 > tmp; if (-1 == tmp) break; int len = 0; a[len++] = tmp; while(1) { ...
阅读全文
摘要:给定两个字符串x,y,求得相互之间转换的最小操作次数(最小编辑距离)。dp[i][j]表示x的前i个字符和y的前j个字符的最小编辑距离,与以下三个值有关: dp[i-1][j] dp[i - 1][j - 1] dp[i][j - 1]对于第一个,要求的dp[i][j],要做的是比较x[i]和空(可能是insertion或者deletion,不关注),操作代价为1。对于dp[i][j - 1]同样...
阅读全文
摘要:给定一串数字,要求子序列和最大的值。这个子序列是连续的。要不然,就直接选取全是正值的加和即可。我开始很直接的就想到一个O(n^2)的算法,因为子序列又开始位置i和结束位置j。我就定义了一个二维数组,索引就是位置,例如,a[i][j]表示,子序列i到j的和,然后遍历一边二维数组,得到最大的值。代码如下:#include using namespace std;int main() { int ...
阅读全文
摘要:这道题目比较有意思,给定三个字符串,判断第三个字符串是不是前两个字符串中的字符组成的,而且,在前两个字符串中的字符要与原串中的顺序一致才行。例如,cat tree cattree就可以,但是tretac就不行了。解决这个我首先想到的是使用递归的方法解决:用三个变量记录三个字符串的扫描位置,初始都是0,然后递归遍历每个字符,判断是否于第三串中相等,相等则游移一位。代码如下:#include #inc...
阅读全文
摘要:依旧是如何找到递归表达形式。这个我目前也没有更好的方法,只能遇到一道题目,就解决一道,想不到就抄别人的,变成自己的,积累经验。这道题目中提到的对齐方法,可以任意的加空格,用‘-’表示。那这个情况就比较多了,要怎么处理呢。总结递归表达形式如下,对于任意第一个前i个字符和第二个前j个字符匹配的最大匹配值dp[i][j]可取一下三个之中最大:a[i]第一个字符串的前i个字符,b[i]第二个字符串的前j个...
阅读全文
摘要:将一个问题的解决过程,表达为递归的形式,还是挺难的,有的问题递归藏的很深。有的问题本身进行递归,有的却要转换一下,这个是很重要的。POJ1159题,对于一个给定的字符串最少插入几个字符,可以变成一个回文字符串。这道题目,刚刚看,觉得无从下手,因为事先知道使用动态规划解决,要找到解的递归形式,怎么也没想明白(其实是可以的)。后来变换思路,逆向思维,因为要插入一些字符,才能变为回文,那去掉插入的这些字...
阅读全文