摘要:一,组合数学问题 1)排列定义 • 从n个不同的元素中,取r个不重复的元素,按次序排列,称为从n个中取r个的无重排列。 •排列的全体组成的集合用P(n,r)表示。当r=n时称为全排列。 组合定义 • 定义从n个不同元素中取r个不重复的元素组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组合。 • 组合的全体组成的集合用C(n,r)表示。 2)例题一:某车站有6个入口处,每个入口处每次只能进一人,一组9个人进站的方案有多少? 【解法】一进站方案表示成:00011001010100 其中“0”表示人,“1”表示门框,其中“0”是不同元,“1”是相同元。给“1”n个门只用n-1个门框..
阅读全文
摘要:题目:设计一个高效算法,求两个等长为L的升序序列A和B的中位数。 例如:S1=(11,13,15,17,19) S2=(2,4,6,8,20) 则S1和S2的中位数是11。1)问题分析1: 简单的算法是将两个升序序列归并排序,然后求其中位数算法的时间复杂度和空间复杂度均为0(n)2)问题分析2: 利用归并排序的思想对A和B的元素逐个访问,同时计数,当访问到第L个元素时即为所求。 算法时间、空间复杂度分别为O(n), O(1)3)问题分析3: 分别求A和B的中位数a和b。 (1)若a=b,则a或b即为所求。 (2)若a<b,舍弃a所在序列A中的较小一半,同时舍弃b中所在序列B较大一半,两者
阅读全文
摘要:一,例题:找出n个自然数(1,2,3,…,n)中r个数的组合。 •例如,当n=5,r=3时,所有组合为: 12 3 1 2 4 12 5 13 4 13 5 14 5 23 4 23 5 24 5 34 5 total=10 {组合的总数} •算法设计1)n个数中r的组合,其中每r个数中,数不能相同;2)任何两组组合的数,所包含的数也不应相同。例如,5、4、3与3、4、5。为此,约定前一个数应小于后一个数。将上述两条作为约束条件;3)当r=3时,可用三重循环进行枚举。 【解法一】穷举法 #include <iostream>using namespace s...
阅读全文
摘要:一,算法策略应用 1)关于背包问题 按与利润关系划分 •与利润无关的背包问题 •与利润有关的背包问题 按物体装入背包的多少 •部分背包问题•0-1背包问题 2)背包问题的求解策略,根据不同的需求 •贪心法、回溯法、分支限界法、动态规划 • 递归或非递归求解二,背包问题展示 1)背包问题1 • 问题描述:给定n种物品,从中选出m件,使其重量之和与T之差的绝对值为最小。 例如:n=9,m=3,T=500克。• 问题分析1:采用三重循环,枚举法。 数据变化过程: (1,2,3) (1,2,4) …(1,2,9) (1,3,4) (1,3,5) …(1,3,9)…(1,8,9) (2,3,4)...
阅读全文
摘要:一,贪心算法的设计思想 •从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解。当达到某算法中的某一步不需要再继续前进时,算法停止。二,贪心算法的基本性质 1)贪心选择性质所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心法与动态规划法的主要区别。 2)最优子结构性质 该问题解的整体最优性依赖于其局部子问题解的最优性。这种性质是可以采用贪心算法解决问题的关键特征。例如,活动安排问题,在选择了一项活动后,它必须是最优的,否则不能得到全局的最优。三,贪心算法...
阅读全文
摘要:一,问题描述 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。二,分析 采用逐步试探的方式,先从一个方向往前走,能进则进,不能进则退并尝试另外的路径。首先我们来分析一下国际象棋的规则,这些规则能够限制我们的前进,也就是我们前进途中的障碍物。一个皇后q(x,y)能被满足以下条件的皇后q(row,col)吃掉 1)x=row(纵向不能有两个皇后) 2) y=col(横向不能有两个皇后) 3)col + row = y+x;(斜向正方向) 4)col - row = y-x;(斜向反方向) 遇到上述问题之一的时候,说明我们已经
阅读全文
摘要:一,问题由来 货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。 二,问题描述 1)货郎担问题提法:有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短? 2)旅行商问题的提法:假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。三,问题求解 1)动态规划解 例题:设...
阅读全文
摘要:一 ,问题描述: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。所谓01背包,表示每一个物品只有一个,要么装入,要么不装入。二,解决方案: 考虑使用dp问题 求解,定义一个递归式 opt[i][v] 表示前i个物品,在背包容量大小为v的情况下,最大的装载量。opt[i][v] = max(opt[i-1][v] , opt[i-1][v-c[i]] + w[i]) 解释如下:opt[i-1][v] 表示第i件物品不装入背包中,而opt[i-1][v-c[i]] + w[i] 表示第i件物品装入背包中。花费如下: 时间复...
阅读全文
摘要:•问题描述: 残缺棋盘是一个有2k×2k(k≥1)个方格的棋盘,其中恰有一个方格残缺。如图给出k=1时各种可能的残缺棋盘,其中残缺的方格用阴影表示。• 残缺棋盘问题就是要用这四种三格板覆盖更大的残缺棋盘。在此覆盖中要求: 1)两个三格板不能重叠 2)三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。小格子数(2k×2k -1)三格板中小格子数3。所以所需要的三格板总数为(2k×2k -1 )/3。•例如,一个4*4的残缺棋盘2k*2k以k=2时的问题为例,用二分法进行分解,得到的四个k=1的棋盘。但要注意这四个棋盘,并不都是与原问题相似且独立的子问题。 因为当如图
阅读全文
摘要:一,迭代与递推 1)迭代法也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法一般用于数值计算。迭代法应该是我们早已熟悉的算法策略,程序设计语言课程中所学的累加、累乘都是迭代算法策略的基础应用。例如:斐波那契数列 例子:兔子繁殖问题 一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少只兔子。 •问题分析 因为一对兔子从出生后第三个月开始每月生产一对小兔子,则每月新下生的小兔子的对儿数显然由前两个月的小兔子的对儿数决定。则繁殖过...
阅读全文
摘要:一,概述 算法策略和算法是有区别的,它们是算法设计中的两个方面,算法策略是面向问题的,算法是面向实现的; 但二者又是不可分的,首先是通过算法策略才找出解决问题的算法,其次对于用不同算法求解的问题算法策略是自然不同的。二,算法策略 1)递推策略:“递推法”和贪心算法一样也是由当前问题的逐步解决从而得到整个问题的解,只是依赖的是信息间本身的递推关系,每一步不需要策略参与到算法中,它们更多地用于计算。 2)递归策略:递归法是利用大问题与其子问题间的递归关系来解决问题的。每次找出大问题与小的子问题之间的关系,直到小的子问题很容易解决,再由小的子问题的解导出大问题的解。。例如:...
阅读全文
摘要:http://www.newsmth.net/pc/pccon.php?id=10001420&nid=273678&pid=0&tag=0&tid=18452组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处。不论是哪种全排列生成算法,都遵循着“原排列”→“原中介数”→“新中介数”→“新排列”的过程。其中中介数依据算法的不同会的到递增进位制数和递减进位制数。关于排列和中介数的一一对应性的证明我们不做讨论,这里仅仅给出了排列和中介数的详细映射方法。相信熟练掌握了方法就可以
阅读全文
摘要:一,题目:(谷歌笔试) n支队伍比赛,分别编号为0,1,2……n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名编程实现,给出二维数组w,一维数组order 和 用于输出比..
阅读全文
摘要:一,题目:求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码二,分析:假设最大子矩阵的结果为从第r行到k行、从第i列到j列的子矩阵,如下所示(ari表示a[r][i],假设数组下标从1开始): | a11 …… a1i ……a1j ……a1n | | a21 …… a2i ……a2j ……a2n | ..... | ar1 …… ari ……arj ……arn |第r行 . . . .......... | V | ak1 …… aki ……akj ……a
阅读全文
摘要:一,最大子矩阵问题: 给定一个n*n(0<n<=100)的矩阵,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。Example:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2其中左上角的子矩阵:9 2-4 1-1 8此子矩阵的值为9+2+(-4)+1+(-1)+8=15。二,分析 子矩阵是在矩阵选取部份行、列所组成的新矩阵。例如它亦可用A(3;2)表示,显示除掉第3行和第2列的余下的矩阵。这两种方法比较常用,但还是没有标准的方法表示子矩阵。以上为维基百科上给出的定义,感觉跟此题的定义不是一回事呢? 我们首先想到的方法就是穷举一个.
阅读全文
摘要:一,题目:最大子段和: 给定一个长度为n的一维数组a,请找出此数组的一个子数组,使得此子数组的和sum=a[i]+a[i+1]+……+a[j]最大,其中i>=0,i<n,j>=i,j<n 例如:31 -41 59 26 -53 58 97 -93 -23 84 子矩阵59+26-53+58+97=187为所求的最大子数组。二,源码第一种:直接穷举法:#include <iostream>
using namespace std; int main()
{ int a[10]={31, -41, 59, 26, -53, 58, 97, -93, -23, 8
阅读全文
摘要:一,题目: 生产者消费者线程演示 一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列二,分析: 这一个,为操作系统上的一个经典例子,以下是july给出的解答 三,源码:#include <windows.h> #include <stdio.h> #include <process.h> #include <iostream> #include <queue> using namespace std; HANDLE ghSemaphore; //信号量 const int gMax = 100; /...
阅读全文
摘要:一,题目 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 例如:1******3***2 ,12*****3这些都要找出来 生活中,比如输入:法你轮和功 会被和谐的二,分析: 自然匹配就是对待匹配的每个字符挨个匹配,设你的待匹配字串长度位n,模式字符串长度位m。对于待匹配字符串中的任意一个字符最坏情况下要匹配m次,也就是说这个字符不在模式字符串中。所以最坏情况下总共是m*n此匹配,时间复杂度就是O(m*n) 倘若使用hash表对待字符串进行hash处理O(n)的时间复杂度,那么对于模式字符串中的任意字符,仅需一次hash判断就可以得知是否在...
阅读全文
摘要:一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如: var a=[100 ,99 ,98 ,1 ,2 ,3]; var b=[1, 2, 3, 4, 5, 40]; 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。二,分析第一种算法: 当前数组a和数组b的和之差为 A = sum(a) - sum(b) a的第i个元素和b的第j个元素交换后,a和b的和之差为 A' = sum(a)
阅读全文