计算机中的数学
本专栏的主题是计算机科学中的数学问题。主要讲述组合数学、具体数学、概率论、博弈论中的计算机经典问题。同时也是程序员求职面试中经常遇到的数学问题。让我们一起享受数学之美吧。
https://github.com/lucky521
ojshilu
https://github.com/lucky521
展开
-
寻找不在数组中最小的正整数 First Missing Positive
问题:给出一个无序的数组,其中包含有任意的整数。现在要求返回不包含在数组中的最小的正整数。要求:时间复杂度O(n),空间复杂度O(1)。思路:如果不要求空间复杂度,可以用hash、map进行统计。但是现在,不允许借助临时空间。但是对于无序数组,不借助空间怎么可能统计的出来。因此,唯一的出路,就是把输入数组自己作为临时空间使用。这道题用了一个类似计数排序的技巧。把一个正数是否存在这一原创 2014-03-08 20:14:49 · 3013 阅读 · 0 评论 -
数独求解 Sudoku Solver
数独游戏是个经典的游戏。现在我要通过程序的方法才自动求解一个数独。这个问题在《Puzzles for Programmers and Pros》一书中有讲解。思路:最直接的方法是,可以用backtracking进行递归尝试。一旦探测到错误就回溯,最终将在递归的最深处发现正解。注意backtracking是可以用引用类型参数进行递归深入的,但是递归回溯出来的时候一定要将改变的值回复回原样原创 2014-03-07 21:16:36 · 1427 阅读 · 0 评论 -
求一个序列的逆序数 Inversion Count for an array
在这篇博文《通过交换相邻数来完成排序所需要的最少交换次数》中,提到了逆序数的概念。它的用处还是很广泛的。本文研究一下怎么求逆序数。按照定义来做的直观求解方法的时间复杂度是O(n^2)的,这个复杂度是不理想的。有没有O(nlogn)的方法呢?当然了,一种优化的求法引入了分治思想(Divide and Conquer)。分治思想的两个经典应用,都在解决排序问题上,一个是归并排序算法,一个是快速原创 2014-01-01 20:13:12 · 2466 阅读 · 1 评论 -
涂色问题之 同一排涂三种颜色 Coloring problem
问题:一排n个方块,现有3种颜色,要给这n个方块涂上颜色。要求:相邻方块颜色不同;第一个方块和最后一个方块颜色不同。思路: 递推思想。假设给n个方块涂色的问题是f(n)。那么前n-1个方块的涂色问题就是f(n-1)。1、假设第n-1块的颜色和第1块不同,那前n-1个方块就是f(n-1)问题。由于第n块的颜色既不能和第n-1块颜色相同,也不能第1块相同,那么第n块只能选择剩下的原创 2013-12-30 11:38:20 · 7456 阅读 · 0 评论 -
最多能运送到的货物数量 Camel and Bananas
Question: The owner of a banana plantation has a camel. He wants to transport his 3000 bananas to the market, which is located after the desert. The distance between his banana plantation and the mark原创 2013-12-24 15:27:46 · 1738 阅读 · 0 评论 -
全排列生成 Permutations
题目源自于leetcode。题目:Given a collection of numbers, return all possible permutations.For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].原创 2013-11-13 18:44:50 · 1512 阅读 · 0 评论 -
卡车能行驶到的最远距离 50 trucks with payload
题目: Given a fleet of 50 trucks, each with a full fuel tank and a range of 100 miles, how far can you deliver a payload? You can transfer the payload from truck to truck, and you can transfer fuel from原创 2013-12-20 19:12:38 · 4130 阅读 · 0 评论 -
Is Your Husband a Cheat? 死理性派问题
这是一个具有递推性质的死理性派问题。问题:A certain town comprises of 100 married couples. Everyone in the town lives by the following rule: If a husband cheats on his wife, the husband is executed as soon as his wife f原创 2013-12-17 13:58:16 · 1348 阅读 · 0 评论 -
打靶组合问题 打靶十次中90环的情况数 integer partition
所谓整数拆分即把整数分解成若干整数的和,相当于把n个无区别的球放到n个无标志的盒子,盒子允许空着,也允许放多于一个球。整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数。原创 2013-12-13 18:39:54 · 6081 阅读 · 0 评论 -
通过交换相邻数来完成排序所需要的最少交换次数
对一个无序序列进行排序,要求一次只能交换相邻的两个数,那么最少需要交换多少次才可以完成排序呢?本问题假设序列所有数各不相同。概念介绍:1、逆序。一般认为从左向右序列的数字增大认为是正序的,那么从左到右序列的序列数字出现减小就认为是逆序的。一个“逆序”的数学定义是这样的,如果存在正整数 i, j 使得 1 ≤ i A[j],则 这个有序对称为 A 的一个逆序,又称作一个逆序对原创 2013-12-02 10:27:06 · 21298 阅读 · 0 评论 -
二分算法实现幂函数x的n次方 Pow(x, n)
题目源自于leetcode。二分算法。题目:Implement pow(x, n).思路: 应该先考虑清楚,再下笔coding。 特殊情况:x取0时,0^n=0。 x取1时,1^n=1。 n取0时,x不能为负数,x^0=1。 x取负原创 2013-11-29 20:42:55 · 6769 阅读 · 2 评论 -
按身高排成两队问题 catalan数
题目源自于阿里巴巴校招笔试题。题目:12个高矮不同的人,排成2排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?思路:假设12个人的身高为,0 1 2 3 4 5 6 7 8 9 10 11。我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排。用0表示对应的人在第一排,用1表示对应的人在第二排。那么含有原创 2013-11-04 19:16:00 · 1878 阅读 · 0 评论 -
圆圈报数最后剩下的数 约瑟夫环问题 Joseph
问题:有n个数,围成一个圈。现在从某一个数开始顺时针报数(第一个报1,依次报数),当报到m时,将报数者删除。并从下一个数开始重新报数。问,最后一个留下的数是谁?假设这n个数依次是0,1,2...n-1。问题源于:高德纳的《具体数学》。9oj编号1356。剑指45。思路:本题最直观的思路是按照题目说的一步一步做,O(n*m)级别的。当数字n很大的时候,变得非常慢。因此下面原创 2013-09-15 22:35:24 · 3897 阅读 · 1 评论 -
只用位运算来实现整数的加减乘除四则运算
问题一: 位运算实现加法问题二:只用加法实现减法、乘法、除法问题三:只用加法实现1+2+3+...+n,(循环、判断语句也不用)下面逐一解决:问题三:方法1:只用加法实现1+2+3+...+n1、利用递归来代替循环结构;2、利用&&与运算的特性来代替if结构。int add(int n, int &sum)原创 2013-09-05 22:21:38 · 15425 阅读 · 5 评论 -
求一个数的平方根
方法一: 使用标准库函数, 中的sqrt函数直接计算。其函数原型为: float sqrt (float),double sqrt (double),double long sqrt(double long)但是不知道标准库函数时怎么实现的。方法二:二分查找法可以根据自己希望的精确度来规定循环的结束条件。[cpp] view原创 2013-10-21 10:29:41 · 6511 阅读 · 0 评论 -
高楼扔鸡蛋问题
题目:一座100层的高楼,有2个完全一样的鸡蛋,现在要得出恰好从第几层开始扔鸡蛋下去会碎(可能第1层就碎,也可能第100层都不碎)。题目的问题是:应该如何用最少的测试次数对于任何答案楼层都能够使问题得到解决?分析: 这其实是一个查找问题,要求最坏情况的比较次数也最少。如果100层楼也不碎就是所查找值不存在。 思考1:要知道,最笨(扔的次数最多)的办法是顺序查找法,从原创 2013-10-23 11:01:34 · 3661 阅读 · 0 评论 -
扔骰子的一道概率题
题目:一个骰子,6面,1个面是 1, 2个面是2, 3个面是3, 问平均掷多少次能使1,2,3都至少出现一次?思路:对于一次实验,1的概率是1/6, 2的概率是1/3, 3的概率是1/2。我的方法:把它独立的当做是三个过程。几何分布的期望EX=1/p,方差DX=(1-p)/p^2。第一轮是必然事件,“第一次出现X值”(显然第一回扔骰子就会出现一个X)原创 2013-10-30 09:56:38 · 6467 阅读 · 1 评论 -
八皇后问题 EightQueen
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即要求任意两个皇后不得处在同一行、同一列或者同一对角斜线上。求出总共有多少种摆法。思路: 对于不在同行且不在同列的摆法,8行每行各有一个皇后,那么就是在8列中进行全排列,很明显有8!种情况。在这8!中情况中,再排除对角斜线上在出现冲突的情况。 对于排列组合类型的问题,经常采用递归方式来解决。数据结构:因为每行原创 2013-11-01 20:01:34 · 2139 阅读 · 0 评论 -
卡特兰数在多种问题下的应用 组合数学-Catalan数
卡特兰数是组合数学中常用的一个数列:通项公式为:h(n) = C(2n, n)/(n+1)递推公式为:h(0)=1,h(1)=1,h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) ,(n>=2)。从卡特兰数的递推公式来看,这是一个关于统计划分情况的递归问题。Catala原创 2013-11-09 18:12:07 · 3615 阅读 · 0 评论 -
海盗分金的博弈问题 pirates and gold 虚拟场景递推
背景:一群海盗要分一批金子。每个海盗有一个编号,编号越大等级越高。现在他们要分配这批金子。分配方法:等级最高的海盗提出一种分配方案。然后所有的海盗投票决定是否接受分配,包括提议人。并且在票数相同的情况下,提议人有决定权。如果提议通过,那么海盗们按照提议分配金币。如果没有通过,那么提议人将被扔出船外,由下一个最高等级的海盗再提出新的分配方案。海盗的思维:海盗们基于三个因素来做决定。1,要原创 2013-11-10 18:11:06 · 2196 阅读 · 0 评论 -
普通涂色问题 组合数学-Polya定理
Polya定理是组合数学理论中最重要的定理之一。该定理是要解决这样的问题,在一个集合内,定义了一个等价关系,人们往往关心由这个等价关系所决定的等价类的数目。Polya定理: 设有n个对象,G是这n个对象上的置换群,用m种颜色涂染这n个对象,每个对象涂染一种颜色。若一种染色方案在群G的作用下变为另一种方案,则这两种方案当作是一种方案。那么存在的方案个数为:L=∑mc(ai)/|原创 2013-11-11 22:14:46 · 10268 阅读 · 2 评论 -
整数分解为2的幂数之和
问题:任何整数必定能分解成2的幂之和,给定整数n,求n的此类分解方法的数量。2的幂有:1,2,4,8,16,32,64,128......除了1是奇数之外,其他全部为偶数。比如n = 7时,共有6种分解方法。7=1+1+1+1+1+1+1 =1+1+1+1+1+2 =1+1+1+2+2 =1+2+2+2 =1+1+1+4 =1+2+4原创 2013-11-15 19:39:14 · 6624 阅读 · 0 评论 -
n个不同小球分配到m个相同的非空盒的方法数 组合数学-第二类stirling数
本问题等价于把n个不同的球划分/分配为m份。组合数学概念:斯特林数 斯特林数出现在许多组合枚举问题中,有两类。第一类斯特林数 StirlingS1[n,m], 给出恰包含m 个圈的 n 个元素 的排列数目。 第二类斯特林数 StirlingS2[n,m]给出把 n 个可区分小球分配到m个不可区分的盒子,且盒子没有空盒子的方法的数量。第一类斯特林数和第二类斯特林数有相同的初始条件,原创 2013-11-16 21:24:38 · 4693 阅读 · 0 评论 -
把p个对象排成k个非空循环排列的方法数 组合数学-第一类stirling数
根据《组合数学》中,定理8.2.9:把p个对象排成k个非空循环排列的方法数,称作第一类stirling数,用小写s(p,k)表示。什么叫非空循环排列?比如序列12345,将其首尾连接起来组成循环排列,那么经过循环移动得到的序列都是等价的,即234561,345612等。其和第一类stirling数的关联:两者递推关系式上非常接近。第一类是把p个对象划分为k个非空循环排列原创 2013-11-20 10:25:58 · 1927 阅读 · 0 评论 -
矩形格路径的个数 Unique Paths
题目源自于leetcode。题目:A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).The robot can only move either down or right at any point in time. The robot is try原创 2013-11-20 19:01:25 · 2679 阅读 · 0 评论 -
相同数不能相邻的排列问题 组合数学-容斥原理
题目:1、2、3、4、5各有两个,组成一个十位数,要求相同的数不能相邻,有多少种排法?思路:两组数,每组5个各不相同的数,一共是5对儿,进行排列:0、如果没有要求相同数不相邻,则有10!/(2^5)种排列,记作S。1、如果要求有一对相邻的,那么把这一对儿数看成一个数,则有C(5, 1)*9!/(2^4)种排列,记作S1。2、如果要求有两对相邻的,那么把这两对儿数看成两个数,则有原创 2013-11-21 22:59:04 · 11274 阅读 · 0 评论 -
如何判断一个数是否为素数
对于一个数n,判断它是否为素数(质数)。这是一个喜闻乐见的问题。注意:2是素数,不过下面的算法一般假设所判定数n>2。最直接方法: 由素数的基本概念出发。 依次判断2~n-1的所有整数能否整除n。如果没有一个能整除的,n就是素数;否则不是素数。改进方法: 由非素数的因数(1除外)的特点可知,对于非素数n=A*B,非素数的因数中必定有一个小于等于sq原创 2013-11-22 11:13:48 · 5007 阅读 · 0 评论 -
两人取石子游戏 组合数学-博弈问题
问题源于:编程之美。微策略笔试题。微策略笔试题:桌子上有数值为Number的数字,2个玩家,每个玩家可以选择减去有 Number中连续1,2,,,,位构成的数值,桌子上换成差值,循环下去。提出算法:第一个玩家应该怎么减去桌子上的数值,如果第一个玩家输,返回-1。原创 2013-11-22 19:50:32 · 30074 阅读 · 2 评论