代码改变世界

熵、信息增益以及其他

2014-03-09 18:28 by 夜与周公, 2065 阅读, 1 推荐, 收藏, 编辑
摘要:很长一段时间,都对熵、信息增益懵懵懂懂,一知半解。最近,正巧碰到研究决策树算法,于是乎,恶补了这方面的知识。 1.什么是熵(Entropy) 在信息论里面,熵是对不确定性的测量,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。熵度衡量了系统的不确定性,当我们缺乏对某个系统的知识,... 阅读全文

位运算

2014-03-09 14:42 by 夜与周公, 306 阅读, 0 推荐, 收藏, 编辑
摘要:有关位运算(与运算,或运算,异或运算,左移和右移)是C/C++语言偏向底层的操作。市面上有很多有关位运算的算法技巧,特在此做了整理。 1.Bitmap 什么事Bitmap? Bitmap的核心思想就是“索引”技术,某个比特位作为key,而该比特上的值作为value(可以理解为状态位:0 or 1)。Bitmap既然利用了索引的思想,那么Bitmap这种数据结果的核心就是如何取到某个索引(即定位到某个bit)。 实现手段上肯定是利用位运算,如果想索引到第 i 比特,可以用如下代码:(p + i /8) | (0x1 > 1) a & b,则取出了a与b中相同的位,a与b相同位的平均 阅读全文

二分查找排序

2013-10-30 22:08 by 夜与周公, 558 阅读, 0 推荐, 收藏, 编辑
摘要:二分查找算法,是在大学阶段学习的基础性算法。算法思想简单,但要写出一个正确的二分查找算法并不简单,从1946年提出,到1962年才完成一个正确的二分查找排序算法。二分查找排序算法的变种,也常常出现在各个IT公司的面试题中。本文总结资料尝试给出一个“正确”的二分查找算法,最后给出一个二分查找排序的变种问题。 1. 经典二分查找排序的算法: 1 int BinarySearch(int* array, int n, int x) 2 { 3 assert((array != NULL) && (0 > 1);11 if (array[mid] == x)12 ... 阅读全文

在链表中漫游

2013-08-29 16:10 by 夜与周公, 343 阅读, 0 推荐, 收藏, 编辑
摘要:链表数据结构操作灵活,经常出现在各大公司的面试题中,因此,本文总结了常见的有关链表的面试题。 首先定义链表的数据结构:templatestruct Node{ T data; Node* next;}; 1.基本操作 虽然将其命名成“基本操作”,因为这些对链表的操作与我们正常接触的对链表的操作,完成的功能是一样的,如删除一个节点,增加一个节点。但与正常操作不一样的地方是,增加了一些限制条件。 1)删除节点:只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点 因为不知道头节点的位置,因此,无法遍历获得节点p的前一个节点指针,采用传统的删... 阅读全文

Levenshtein距离

2013-08-22 15:46 by 夜与周公, 603 阅读, 0 推荐, 收藏, 编辑
摘要:Levenshtein Distance,又称Edit Distance,在自然语言处理中有着广泛的应用。Levenshtein Distance 指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。编辑操作包括:1)删除一个字符;2)插入一个字符;3)替换一个字符 Example: 两个字符串a = "kitten", b = "ssitting",编辑过程如下:kitten →sitten (substitution of "s" for "k")sitten → sittin (substitut 阅读全文

动态规划(dynamic programming)

2013-08-20 23:37 by 夜与周公, 404 阅读, 0 推荐, 收藏, 编辑
摘要:动态规划(dynamic programming)是一种高效的程序设计技术,一般应用与最优化问题,即当我们面临多组选择时,选择一个可行解让问题达到最优。动态规划的一个显著特点是:原问题可以划分成更小的子问题的最优化问题,而这些子问题的解往往有着重叠的部分。 动态规划算法的解决一个问题,可以分成四个步骤: 1)描述最优解结构,需找最优子结构 2)递归定义最优值的解 3)自底向上的求解问题 4)依据计算过程,构造一个最优解 1)与 2)是这个问题可以用动态规划解决的理论基础,3)可以看出是动态规划算法的编程实践,4)是算法输出,依赖于3)。下面分别用三个经典的动态规划案例,阐释动态... 阅读全文

数组中子数组之和最大问题

2013-08-19 00:34 by 夜与周公, 350 阅读, 0 推荐, 收藏, 编辑
摘要:问题描述:给定一个包含N个元素的数据A(A[0], A[1], A[2]...A[N-1]),这个数组自然有很多子数组,那么,这些子数组之和的最大值是什么? Example: 数组[1, -2, 3, 5, -3, 2],最大的子数据是[3, 5],和为8。 解法一:穷举法 最直接,也是最简单的方法,穷举子数组A[i:j]的和,找出一个最大的,算法的时间复杂度O(N2),算法的代码如下:#include #include using namespace std;int max_sub_sum(const int* A, int n){ int max_sum = INT_MIN... 阅读全文

文本挖掘之特征选择(python 实现)

2013-08-15 10:32 by 夜与周公, 33372 阅读, 5 推荐, 收藏, 编辑
摘要:机器学习算法的空间、时间复杂度依赖于输入数据的规模,维度规约(Dimensionality reduction)则是一种被用于降低输入数据维数的方法。维度规约可以分为两类: 特征选择(feature selection),从原始的d维空间中,选择为我们提供信息最多的k个维(这k个维属于原始空间的子集)特征提取(feature extraction),将原始的d维空间映射到k维空间中(新的k维空间不输入原始空间的子集) 在文本挖掘与文本分类的有关问题中,常采用特征选择方法。原因是文本的特征一般都是单词(term),具有语义信息,使用特征选择找出的k维子集,仍然是单词作为特征,保留了语义信息... 阅读全文

C++模板专门化与重载

2013-08-10 10:55 by 夜与周公, 1058 阅读, 0 推荐, 收藏, 编辑
摘要:最近在复习C++有关知识,又重新看>,收获颇丰。原来以前看这边书,好多地方都是浅尝辄止。>条款25:考虑写出一个不抛出异常的swap函数,涉及到C++模板专门化(TemplatesSpecialization)和函数重载(overloading)问题,而当重载与模板搅合在一起时,许多问题都变得“模棱两可”。 首先回顾>条款25:考虑写出一个不抛出异常的swap函数,想告诉我们什么东西。 swap函数为我们提供了异常安全编程的方法,以及用来作为处理自我赋值一种常见机制,因此实现一个不抛出异常的swap函数,变得相对重要起来。缺省情况下的swap函数的典型实现如下:namespa 阅读全文

求二进制数中1的个数

2013-08-08 17:05 by 夜与周公, 495 阅读, 0 推荐, 收藏, 编辑
摘要:>中有这么个题目:对于一个字节的无符号整形变量,求其二进制表达形式中“1”的个数。 基础算法:辗转相除法 辗转相除法是十进制采用的算法,该算法如下:int count_one_cnt(int value){ int cnt = 0; while (value) { if (value % 2 == 1) { cnt += 1; } value /= 2; } return cnt;} 上述算法的时间复杂度O(logV)(V是value比特数),上述算法的操作对象的级别是“数”级... 阅读全文