下面是我在一个bbs上看到的几个算法问题,难倒是不是很难,倒是有些地方值得注意,有进一步深究和讨论的必要,下面是我的一些想法,可能不够全面,以后也许随着知识的增长可以有更深刻的认识。
题目:
1.有一个随机数发生器,能以概率p生成0,以概率1-p生成1,问如何做一个随机数发生器
使得生成0和1的概率相等。
2.用上面那个生成0和1的概率相等的随机数发生器,怎样做一个随机数发生器使得它生成
的数在1...N之间均匀分布。
3、20个不同面值的硬币,排成一条直线,每个人都只能从线的两端取硬币
,轮流取,先手用什么样的策略可以保证拿到比后手多的钱?证明之
4、现有一批电脑,好坏不一。已知好的数目比坏的多。我们可以询问某一台电脑另一台电
脑的情况(好or坏),如果询问了一台坏电脑,它可能给出的是错误答案。现要求
设计一种策略,从中挑出一台好电脑,时间复杂度为O(n)。
第一题比较简单,可以用原发生器周期性地产生2个数,直到生成01或者10。
由于生成01和10的概率均为p(1-p),故预先任意指定01为0(或1),10为1(或0)即可。即可等概率的产生0和1,但然,要考虑其他组合的不可用性,获取题目本身就隐含了这个bug或是缺陷吧。
int Rand_01()
{
//produce random 0 and 1
//with probability of 0 being p
int temp1,temp2;
while (true)
{
First(&temp1);
First(&temp2);
if (temp1 == 0 && temp2 == 1) return 0;
if (temp1 == 1 && temp2 == 0) return 1;
//other results ignored,but need more notice here ?????
}
}
第二题,需要一些思考......想到位运算,因为i个二进制位随机的选择0或1,可以随机的构成0~2^i的数,而这些数构成了所有的组合数。因此是等概率出现的。比如:2位二进制位,这两位可以随机为0或1而互不影响,随机的构成了00 01 10 11,它们代表了四个数,且这四个数是等概率的。
int Rand_0N_1(double n)
{
//use the procedure producing 0-1
//Method one
int i,result,size;
result = n+1;
size = (int)log(n)/log(2.0) + 1;
while (result > n)
{
//filter for right number
result = 0;
for (i = 0;i < size+1;++ i)
{
result <<= 1; //move left
result += rand01();
}
}
return result;
}
上面采用了的是移位操作,当然也可以建立数组分别表示各位,思路基本相同,不再赘述。不过函数循环中产生的无效数也是等概率的产生的,只是不采用,相当于此次作用产生无效,故继续作用。所以最终表现的结果是(0~n等概率的)
关于此题还有一个不太成熟的算法,结果接近最终的结果:
int Rand_0N_2(double n)
{
//Method Two
int result=0;
int i;
for (i = 0;i < SS;++ i) result += rand01();
return result%((int)n+1);
}
上述的SS是待讨论的阈值,当然值越大愈好,因为值愈大,result的值跨度就愈大,从0到SS,而产生他们的概率则是倒的双曲线(大概是吧,不是很精确,呵呵),也就是由小到大,在由大到小。当SS的值较大时,可将这些数按n为单位进行划分(也就是后面用到的求余操作),这样就将概率均分了,最终产生的数也就等概率了。
由此可知,在中间数(如n/2)产生的概率就高些,理论上是这样的,不过实验结果还算理想,基本上SS为n的平方即可达到理想结果。
此外,另外一种思路供参考(结果比较理想):
int Rand_0N_3(double n)
{
static int result=0;
int i,size;
size = (int)log(n)/log(2.0) + 1;
for (i = 0;i < size;++ i) result += rand01();
return result%((int)n+1);
}
第三题,我们可以如下解决:
记 SUM_1=奇数位置硬币的和
SUM_2=偶数位置硬币的和
不妨设SUM1>=SUM2
那么先手的你每次拿奇数就好。
注意到先手的你拿的时候 有偶数个硬币,那么头和尾的编号一个奇数一个偶数。
其他的就没有要说的了,只要保证自己每次拿到那组总和最大的一组即可。不过,如果,奇数组和偶数组的和是相同的,此算法只能保证拿到的不比后方少,也就是一种可行解,当然不是最优解,或许可以采用其他的算法(比如贪心算法、回溯法等)找到更好更优的解,自己还在探讨中,还没头绪......
第四题,我们可以做分析:
将所有电脑两两分组,
(1)如果相互报告均为好电脑,则随便淘汰一个,
(2)否则,即出现了报告为坏的情况,两个都淘汰.
两两一组的可能无非是:
打*的是报告为坏的情况,两个都淘汰,因此每次淘汰要么一个好一个坏,要么两个坏,这样进行下去,就可逐步淘汰坏的,保留好的
G for Good, B for Bad.
All (GB) will be deleted, num(G)-num(B) will not change.
For the case of (BB) and (GG), num(G)-num(B)>=0.5num(G)-0.5num(B)=0.5(num(G)-
num(B))>0;
mention that: If (BB) reports (GB), both of the B will be deleted.
分享到:
相关推荐
【算法赏析:几个经典的算法问题】 在计算机科学中,算法是解决问题的核心工具,它们通过一系列精确的步骤来解决特定的问题。本篇文章将深入探讨五个经典算法:匈牙利算法、八皇后问题、二叉树遍历、希尔排序以及...
书中的知识点可以分为以下几个部分: 1. **排序算法**:小灰可能会遇到如何整理物品的问题,书中会讲解各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序等。这些算法在处理数据时各有...
源代码应该包括以下几个部分: 1. 初始化:创建城市节点和它们之间的距离矩阵。 2. 贪心算法实现:按照当前城市和下一个最近城市的原则构建路径。 3. Dijkstra算法实现:找到所有城市到起点的最短路径,并组合成环形...
从给定的文件信息来看,标题“算法设计<几个基本的算法>”和描述“好不容易整理出来的 与大家一起分享了 大家踊跃下载把”,以及标签“算法 数据结构”,表明这是一个关于算法和数据结构的主题,可能包含了一些基础...
总之,"十几个经典算法研究(编程学习)"涵盖了编程中的一些基础和进阶算法,它们不仅是解决问题的有效工具,也是提升编程技能的基石。深入理解和实践这些算法,将为你的编程之路开启新的篇章。
8. **分治策略**:将大问题分解为两个或更多的相同或相似的小问题,再将小问题的解合并,以获得原问题的解。例如,快速排序和归并排序都是典型的分治算法。 9. **递归与迭代**:递归是函数直接或间接调用自身的过程...
在本压缩包中,我们可以看到一个名为"几个算法实现"的文件,这通常包含了一些常见的算法设计和实现,使用C++编程语言编写,并且带有注释。这些算法是计算机科学和信息技术领域的基础,对于理解和解决各种计算问题至...
在IT领域,推荐系统是大数据应用的一个重要方向,主要用于个性化推荐,提高用户满意度和平台的商业价值。...通过理解和实践这些算法,不仅可以提升对推荐系统的理解,也有助于提高解决实际问题的能力。
2. **分而治之算法**:该算法将大问题分解为小问题,分别解决后再合并结果,例如快速排序、归并排序等。分而治之能够简化问题复杂度,并提高解决问题的效率。 3. **动态规划**:动态规划是解决最优化问题的一种方法...
一个好的算法应具备以下几个特性:可行性(可被执行)、确定性(每一步都有清晰的结果)、有限性(有终止条件)和输入(可以处理零个或多个输入)。 在设计算法时,我们通常采用结构化方法,如分治策略、动态规划、...
以下是对每个算法的详细解释: 1. **Floyd算法**:也称为Floyd-Warshall算法,是一种用于求解所有顶点对之间最短路径的动态规划方法。它通过迭代更新的方式找出图中任意两点间的最短路径,对于有负权边的图,Floyd...
实验报告通常会包含以下几个部分: 1. **引言**:介绍最小生成树的概念,以及Prim和Kruskal算法的基本思想。 2. **算法描述**:详细解释两种算法的步骤,包括伪代码或流程图。 3. **实现细节**:展示如何用编程语言...
本入门项目包含几个小项目,旨在让新手逐步熟悉Python中的算法和函数。每个项目都带有注解,这有助于理解代码背后的逻辑。注解通常以`#`开始,它不会被Python解释器执行,但能为阅读代码的人提供信息。通过这些注解...
在编程和算法设计中,递归是一种强大的工具,它通过函数自身调用来解决问题。递归通常用于解决可以被简化为相同子问题的问题,比如树的遍历、分治策略、动态规划等。以下是对给定标题和描述中涉及的递归算法问题的...
这通常会包括以下几个关键部分: 1. 初始化种群:随机生成一组城市顺序作为初始解,即第一代种群。 2. 适应度评估:计算每个个体(城市顺序)对应的路径长度,作为其适应度值。 3. 选择操作:根据适应度值进行选择...
在VC6.0环境下,这个算法能够很好地处理输油管道问题中涉及的大规模数据。 源程序的实现细节可能包括以下几个部分: 1. 数据结构:可能使用了数组或者链表来表示输油管道网络,每个节点代表一个管道或油库,边则...
数学建模中关于Matlab数学软件中几个经典的算法的程序
在TSP问题中,鱼群算法的具体实现通常包括以下几个步骤: 1. 初始化:随机生成一定数量的“鱼”,代表旅行商可能的路径。每条“鱼”是一个解,由城市序列组成。 2. 觅食行为:每条鱼根据当前解的质量(即路径长度...
首先,我们来看一下几个常见的小算法: 1. **排序算法**:排序是计算机科学中最基本的问题之一,包括快速排序、归并排序、插入排序、冒泡排序、选择排序等。这些算法各有优劣,适用于不同的场景,如快速排序在...
该算法包含几个关键步骤: 1. **初始化**:首先,随机生成一个初始解,即一组物品的选择方案,计算其总价值和总体积。 2. **生成邻居解**:从当前解出发,通过某种方式(如交换两个物品、替换一个物品等)生成一个...