摘要: 由于发现CSDN的博客现在做了不少改进,UI方面也越来越人性化了,现将博客搬迁至CSDN.地址为:http://blog.csdn.net/fy2462欢迎大家来参观。 阅读全文
posted @ 2014-06-07 15:25 MichaelGD 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 公司布置了一个任务让写一个决策树,以前并未接触数据挖掘的东西,但作为一个数据挖掘最基本的知识点,还是应该有所理解的。 程序的源码可以点击这里进行下载,下面简要介绍一下决策树以及相关算法概念。 决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测(就像上面的银行官员用他来预测贷款风险)。从数据产... 阅读全文
posted @ 2012-11-14 23:00 MichaelGD 阅读(7181) 评论(0) 推荐(0) 编辑
摘要: 这是一道比较传统的面试题,自己写了个10进制的求1个数的程序,后来在《编程之美》中发现上面的解法更好一些,随后有用它的方法重写了一遍2进制下的求解方法。 程序源码请点击这里下载。 对于自己写的10进制程序:主要思想还是从前期的分析得出来的: 1、先统计N的相应位置所对应的累加和数组 2、从前到后,根据所当前位置对应的位数,进行累加,即: 1)当当前为为1时,当前位置所对应的单位个数+低位数值+1; 2)当当前为为0时,用当前位置的数值*当前位置为所对应的1的单位总个数+低位数值; 3、求出当前位总和后,向下一位移位,递归累加 程序主要源码如下: 1 long long... 阅读全文
posted @ 2012-11-14 17:36 MichaelGD 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 这是一道企业面试中,经常会被问到的面试题目。在网上看到一些此题的实现,其中有两种方法是比较适合编程的。本项目的源代码,请点击这里下载。方法一: 此方法是根据二叉树的DFS查找并标记祖先,根据递归出栈的原理,找到公共祖先。 其主要代码如下: 1 #include <iostream> 2 #include <list> 3 #include "LinerLCA.h" 4 5 //DFS左右子树,查找pNode是否存在 6 /*@param pRoot 根节点 7 /*@param pNode 需要查找的节点 8 /*@param path pNode所 阅读全文
posted @ 2012-11-12 19:27 MichaelGD 阅读(560) 评论(0) 推荐(0) 编辑
摘要: 本文实现了根据余弦距离的文本相似度的C++实现算法,如要要点如下:1、对1998年1月的人民日报所有文章进行预处理(其中文件已经分化好分词),然后进行去噪声、去停用词等操作。2、对处理好的数据进行余弦计算,并存储为相应的数据结构。3、输出前N篇最相似的文章下面介绍Statistics.cpp,对预处理文件进行统计词频。 1 #pragma once 2 #include "TextSimilarity.h" 3 #include <windows.h> 4 5 6 void ContentStatistics(string& ArticleContent 阅读全文
posted @ 2013-03-18 16:09 MichaelGD 阅读(2276) 评论(1) 推荐(1) 编辑
摘要: 一、基本概念在数据库中,对某数据的两个基本操作为写和读,分布有两种锁控制:排它锁(X锁)、共享锁(S锁)。排它锁(x锁):若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁; 一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。共享锁(s锁):若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁; 一般要求在读取数据前要向该数据加共享锁, 所以共享锁又称读锁。程序所收到的请求包括以下五种:Start、End、XLock、SLock、UnlockStart:开启相应的事件请求End: 关闭相... 阅读全文
posted @ 2013-01-24 14:21 MichaelGD 阅读(1102) 评论(0) 推荐(0) 编辑
摘要: 在编程之美3.1中,此题解法是用strstr()函数,并且以空间换时间,其实只要用循环遍历即可其时间复杂度: k < O(n) < k+ n, 其中k为查找串的长度,n为数据串的长度,空间复杂度为O(1)。代码如下: 1 #include<iostream> 2 using namespace std; 3 4 int findSubStr(char source[], char subStr[], int sLen, int oLen) 5 { 6 if(source == NULL || subStr == NULL || sLen <=0 || oLen & 阅读全文
posted @ 2012-12-20 21:42 MichaelGD 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在学习SVD时发现的好文,推荐给大家,原始地址为:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html原文如下:前言: 上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的。在上篇文章中便是基于特征值分解的一种解释。特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特 阅读全文
posted @ 2012-12-18 17:11 MichaelGD 阅读(305) 评论(0) 推荐(0) 编辑
摘要: ACE(Adaptive Communication Environment),它是一个面向对象的、跨平台的、开放源码的网络编程基础设施框架。 ACE 是由加利福尼亚大学Irvine分校的Douglas C.Schmidt 博士主导开发的,是一种跨平台可编译的网络编程API,并随后在工业界中发展、完善,它将底层的不同系统的细节透明化,为开发者提供统一的接口,从而可在不同系统上相互移植,提高代码利用率。与传统的网络编程相比,它更加规范化,极力避免工业开发中人们常会出现的错误情况,从而提高了程序的可靠性和易用性,并且拥有较高的性能优势。 读者可以从http://www.cs.wustl.edu/. 阅读全文
posted @ 2012-11-30 20:46 MichaelGD 阅读(558) 评论(0) 推荐(0) 编辑
摘要: 本题为编程之美中的第2.7题,上面的解法比辗转相除发的时间复杂度要小很多。看完之后用while循环代替了递归重写了一下。废话少说,上源码: 1 #include <iostream> 2 using namespace std; 3 4 int GDC(unsigned long long x, unsigned long long y) 5 { 6 unsigned long long deep = 1; 7 while(y != 0) 8 { 9 if (x < y)10 {11 x ^= y;12 ... 阅读全文
posted @ 2012-11-28 15:56 MichaelGD 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 1、概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。2、基本操作 并查集是一种非常简单的数据结构,它主要未来解决如下两种经常性操作而产生的,分别为: A. 合并两个不相交集合 B. 判断两个元素是否属于同一个集合(经常性)(1)合并两个不相交集合 合并操作很简单:先设置一个数组Father[x],表示x的“父亲”的编号。那么,合并两个不相交集合的方法就是,找到其中一个集合最父亲的父亲(也就是最久远的祖先),将另外一个集合的最久远的祖先的父亲指向它。上图为两个不相交集合... 阅读全文
posted @ 2012-11-28 15:47 MichaelGD 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 这道题目所说的出现最多的几个数值,其实是带有附加条件的: 这几个数值中出现次数最少的那个数,要比除这几个值外的其他数的总个数要多。(说的自己都有点晕-_-!)这样才能在最后结果中,呈现这几个数。所以必须按照数据源中的统计量分析出求前几位的数值。其代码如下: 1 #include <iostream> 2 #include <hash_map> 3 using namespace std; 4 5 void Find(int data[], int length, hash_map<int, int>& hMap,int id_count) 6 { 7 阅读全文
posted @ 2012-11-23 22:23 MichaelGD 阅读(499) 评论(0) 推荐(0) 编辑
摘要: 这是一道很普遍和基础的题目,有很深的扩展性。一、首先,第一反应往往会想到快速排序后,再输出K个元素,但是时间复杂度为O(N*logN/log2) + O(K) = O(N*logN/log2)。 另外一种做法是,通过冒泡排序选出K个最大的出来,它的时间复杂度为O(N*K)。 这就要比较K < logN/log2 ? K : logN/log2 来取舍算法了,但是这些都不是比较好的办法。二、那么,进一步化简: 快排的过程是找到随机数,将它固定到最终位置,将数据按大小分组,重复递归下去,直到最后排好序,是一种分治的思想。 所以,我们可以找到第k个数的位置(由大到小排序),从而减少了查找交换次 阅读全文
posted @ 2012-11-21 19:35 MichaelGD 阅读(413) 评论(0) 推荐(0) 编辑