代码改变世界

随笔分类 -  C++

二分查找排序

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

Levenshtein距离

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

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

2013-08-19 00:34 by 夜与周公, 348 阅读, 收藏, 编辑
摘要: 问题描述:给定一个包含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... 阅读全文

亲和数问题

2013-08-06 17:14 by 夜与周公, 1002 阅读, 收藏, 编辑
摘要: 求500万以内的亲和数 “朋友是你灵魂的倩影,要像220与284一样亲密。”——毕达哥拉斯 首先需要知道什么事亲和数?亲和数是指,两个数a和b,如果a的所有真因子之和等于b,而b所有的真因子之和也等于a,那么着两个数被称为亲和数(真因子包括1,但不包括自身)。 Example: 220的真因子: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 284的真因子: 1, 2, 4, 71, 142 284 =1+2+4+5+10+1... 阅读全文

寻找序列中满足条件的元素

2013-07-16 22:11 by 夜与周公, 630 阅读, 收藏, 编辑
摘要: 一、基础篇 在>这本书中,给出了这样的一个问题:快速找出一个数组中的两个元素,让这两个元素之和等于一个给定的值,假设数组中至少存在一对这样的元素。 对于这个问题有两种解决思路: 思路一:首先想到的解法是穷举法,即判断序列中任意的两个元素之和是否等于给定的数值。算法的时间复杂度O(N2),显然这种蛮力解法不是我们想要的,需要继续寻找更高效的解法。 思路二:假设预定的两个元素的和等于SUM,对于某个原始array[i],实际上就是要判断SUM- array[i]是否在数组中。如果元素是无序的,算法的复杂度仍然是O(N2),没有任何改进。但如果先进行排序,算法的复杂度是O(NlogN),... 阅读全文

寻找最大(小)的K个数

2013-07-02 20:37 by 夜与周公, 1077 阅读, 收藏, 编辑
摘要: >一书中提到了寻找最大的K个数的问题,问题可以简单描述为:在长度为N的数组中,寻找第K(K#include #include using namespace std;int _tmain(int argc,_TCHAR* argv[]){ int myints[] = {10, 20, 30, 5, 15}; vector v(myints, myints+5); make_heap (v.begin(),v.end()); //构建堆 cout #include #include #include using namespace std;const int... 阅读全文

logistic regression C++实现

2013-06-11 20:14 by 夜与周公, 5020 阅读, 收藏, 编辑
摘要: 在“逻辑斯特回归模型(logistic regression)”一文中阐述了logistic regression模型的理论基础,本节采用C++实现logistic regression。算法是由笔者跟我们老板一起合作完成(老板提供算法框架和理论上的支持,笔者编写代码,准备开源发布)。下面分数据结构、模型实现、模型训练、模型预测与usage五个部分介绍logistic regression模型的实现与用法。 1.数据结构/********************************************************************* Logistic Regre... 阅读全文

sizeof运算符

2013-06-07 17:30 by 夜与周公, 193 阅读, 收藏, 编辑
摘要: sizeof运算符是C/C++比较灵活知识点,本节总结它们的常见用法与错误。 sizeof运算符用于计算数据在内存中占有的字节数。如果sizeof运算于数组,它将会计算数组占有的内存空间。但是需要注意的是,如果采用指针在函数直接传递数据,编译器是无法知道数组的长度,因此,sizeof运算将退化成对指针的运算:#include "stdafx.h"int funa(char my_str[100]){ coutint funa(typename (&T)[N]){ cout<<sizeof(my_str)<<endl; //输出:N} 借此机会 阅读全文

字符串相关操作

2013-05-30 21:38 by 夜与周公, 194 阅读, 收藏, 编辑
摘要: 接下来,总结一些常见的字符串操作算法,第一个介绍字符串拷贝操作。字符串拷贝算法比较著名的资料是林锐的<<高质量的C、C++>>,网上的很多文章都借鉴了里面有关字符串拷贝的论述。虽然字符串拷贝操作看起来很简单,但是如果仔细考虑,不禁觉得原来写代码真是件细工活,一个模板化的C++字符串拷贝代码如下:char* str_copy(const char* pSource, char* pDest){ assert((pSource!=NULL) && (pDest!=NULL)); char* address = pDest; while ((*pDest++ 阅读全文

感知机算法C++实现

2013-05-06 13:14 by 夜与周公, 1441 阅读, 收藏, 编辑
摘要: 本节介绍感知机分类器的C++实现,其分类器实现框架会在后续的一些算法实现都会使用到。 1、类的设计 感知机类设计如下:View Code #pragma once#include <iostream>#include <fstream>#include <iomanip>#include <string>#include <vector>#include <set>#include <map>#include <algorithm>#include <cmath>#include < 阅读全文

C++内存管理

2013-04-09 20:48 by 夜与周公, 288 阅读, 收藏, 编辑
摘要: 一直都想总结一下C++内存管理这一块,因为我发现C++编程的很多错误都是源自对C++内存管理理解的不够透彻。可真要总结的时候,才发现思绪万千,不知从何着手。于是乎网上搜了一些相关博文,加之查阅了一些书籍,比较清晰理出头绪来。 1.C++程序的内存格局 C++程序的内存占用可以分为以下五种: (1)全局变量、静态变量数据区:全局变量,static变量。在main()之前已配置好,在整个程序的生命周期,一直存在。 (2)常量数据区:存储程序的常量数值、字符串等。在main()之前已配置好,在整个程序的生命周期,一直存在。 (3)栈数据区:函数执行时,存储程序的局部变量,保存传递... 阅读全文