摘要:
注:2013年6月6日,我对该博文进行了修改,增加了源代码以及更直观详细的讲解。如果需要代码,可以到文章最后给出的链接进行下载。最近在用weka做一个数据挖掘相关的项目,不得不说,weka还是一个不错的开放源代码库,提供了很多最常用的分类和聚类算法。在我的项目中要用到一个聚类算法,Affinity Propagation(AP),由多伦多大学的Brendan J. Frey发表于2007年。相比其他的聚类算法,AP算法的聚类结果更加准确。在AP的官方网站公布了AP算法的动态链接库,我的目标就是实现在Java工程中调用这个动态链接库。在网上查了资料,发现,如果仅仅是想调用Windows的Nati 阅读全文
摘要:
本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求:1. O(1)空间复杂度,即只能使用常数空间;2. 二叉树的形状不能被破坏(中间过程允许改变其形状)。通常,实现二叉树的前序(preorder)、中序(inorder)、后序(postorder)遍历有两个常用的方法:一是递归(recursive),二是使用栈实现的迭代版本(stack+iterative)。这两种方法都是O(n)的空间复杂度(递归本身占用stack空间或者用户自定义的stack),所以不满足要求。(用这两种方法实现的中序遍历实现可以参考这里。)Morris Traversal方法可以做到这两点,与前两种方法的不同 阅读全文
摘要:
问题的陈述在:https://code.google.com/codejam/contest/2418487/dashboard#s=p2&a=1,官方的分析在:https://code.google.com/codejam/contest/2418487/dashboard#s=a&a=2。这篇文... 阅读全文
摘要:
题目要求在字符串向量中找出所有的anagrams。Anagram中文译为回文构词法,是指通过颠倒字母顺序组成的单词或词组。本题测试数据中给出的字符串向量存在不止一组anagrams。所以本题的难点在于,一是如何判断anagrams,二是如何处理不同组的anagrams。 阅读全文
摘要:
LeetCode第41道题目:给定一个未排序的数组,在其中寻找第一个未出现的正整数。第一个解题思路是首先筛选出所有的正整数,并对其进行排序,最后从小开始遍历,找出第一个未出现的正整数,这个方法的复杂度是O(nlogn)。第二个解题思路是以数组作为哈希,令数组的第i个位置存放整数(i+1),并找出第一个不符合该要求的数组元素。本题目的额外要求是:第一,在O(n)时间内完成;第二,只能具有常数级空间复杂度。这样一来,第一个解题思路就不符合要求,只能对第二种方法进行深入。 阅读全文
摘要:
本题要求编程实现求解整数的平方根。第一个思路是在可能的解范围内进行搜索,通过求平方判定是否为所求平方根。第二个思路是通过牛顿迭代法求解。第一个方法很容易想到,这篇博文主要是针对第二种方法,讲解如何通过牛顿迭代法求解多次方程的解。最后,会对此题目进行小的扩展,即求解实数的平方根。 阅读全文
摘要:
前面曾写过一篇恼人的函数指针(一),总结了普通函数指针的声明、定义以及调用,还有函数指针数组,函数指针用作返回值等。但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是指向类成员的指针,这里将做相应补充(相关代码测试环境为vs 2010)。指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍:一、指向类的普通成员的指针(非静态)1、指向类成员函数的指针简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。总结一下,比较以下几点:a)参数类型和个 阅读全文
摘要:
最近在花时间研读C++。函数这章讲到了函数的变长参数(ellipsis...),但是primer中讲得比较浅,提到了怎么声明怎么调用,但是没有写明在函数内部是如何获取变长的参数的。1)省略号(ellipsis)在无法给出所有传递给函数的参数的类型和数目时,可以使用省略号(...)指定函数参数表。有如下几种形式:1 void fun1(int a, double b, ...); //给出确定的几个参数,其他用省略号2 void fun2(int a ...); //省略号前有或者没有逗号都是可以的3 void fun3(...); //也... 阅读全文
摘要:
在这里总结一下const限定修饰符的各种用法,都已经过vs2010测试。1) 声明及初始化const常量。在声明一个const常量时,必须对其初始化,否则会报错。1 const int constvar; //error2 const int constvar = 10; //ok但是,有一个例外的情况,就是extern进来的const常量不需要初始化(如果该常量其他地方确实有出现,这时将它extern进来并且初始化反而会出错)。1 extern const int externvar;2) 指针。对于指针变量有以下四种情况(这四句是不完整的,其中有些必须在声明时进行初始... 阅读全文
摘要:
这篇是为了加深记忆所写。发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的。1) 函数指针的初始化。函数如下:1intCompareString(conststring&str1,conststring&str2)2{3returnstr1.compare(str2);4}函数的初始化有两种方式:第一种,也是最普遍的方式:1int(*CompareFunction)(conststring&,conststring&)=CompareString;第二种,是使用typedef定义函数类型,这种写法有助于对代码的理解:1typedefint(*Compar 阅读全文