`
CalvinMnakor
  • 浏览: 52354 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

几个小算法问题

阅读更多
         下面是我在一个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
0
分享到:
评论

相关推荐

    算法赏析:几个经典的算法问题

    【算法赏析:几个经典的算法问题】 在计算机科学中,算法是解决问题的核心工具,它们通过一系列精确的步骤来解决特定的问题。本篇文章将深入探讨五个经典算法:匈牙利算法、八皇后问题、二叉树遍历、希尔排序以及...

    漫画算法-小灰的算法之旅_漫画算法-小灰的算法之旅_算法_

    书中的知识点可以分为以下几个部分: 1. **排序算法**:小灰可能会遇到如何整理物品的问题,书中会讲解各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序等。这些算法在处理数据时各有...

    贪婪算法和最小路径算法解决TSP问题matlab源代码

    源代码应该包括以下几个部分: 1. 初始化:创建城市节点和它们之间的距离矩阵。 2. 贪心算法实现:按照当前城市和下一个最近城市的原则构建路径。 3. Dijkstra算法实现:找到所有城市到起点的最短路径,并组合成环形...

    算法设计

    从给定的文件信息来看,标题“算法设计&lt;几个基本的算法&gt;”和描述“好不容易整理出来的 与大家一起分享了 大家踊跃下载把”,以及标签“算法 数据结构”,表明这是一个关于算法和数据结构的主题,可能包含了一些基础...

    十几个经典算法研究(编程学习)

    总之,"十几个经典算法研究(编程学习)"涵盖了编程中的一些基础和进阶算法,它们不仅是解决问题的有效工具,也是提升编程技能的基石。深入理解和实践这些算法,将为你的编程之路开启新的篇章。

    编程的几个经典算法

    8. **分治策略**:将大问题分解为两个或更多的相同或相似的小问题,再将小问题的解合并,以获得原问题的解。例如,快速排序和归并排序都是典型的分治算法。 9. **递归与迭代**:递归是函数直接或间接调用自身的过程...

    几个算法的实现和算法作业

    在本压缩包中,我们可以看到一个名为"几个算法实现"的文件,这通常包含了一些常见的算法设计和实现,使用C++编程语言编写,并且带有注释。这些算法是计算机科学和信息技术领域的基础,对于理解和解决各种计算问题至...

    几个推荐算法的java实现

    在IT领域,推荐系统是大数据应用的一个重要方向,主要用于个性化推荐,提高用户满意度和平台的商业价值。...通过理解和实践这些算法,不仅可以提升对推荐系统的理解,也有助于提高解决实际问题的能力。

    常见的几个经典算法(htm)

    2. **分而治之算法**:该算法将大问题分解为小问题,分别解决后再合并结果,例如快速排序、归并排序等。分而治之能够简化问题复杂度,并提高解决问题的效率。 3. **动态规划**:动态规划是解决最优化问题的一种方法...

    算法与算法分析 - 01 算法问题求解基础.pdf

    一个好的算法应具备以下几个特性:可行性(可被执行)、确定性(每一步都有清晰的结果)、有限性(有终止条件)和输入(可以处理零个或多个输入)。 在设计算法时,我们通常采用结构化方法,如分治策略、动态规划、...

    几个智能算法的MATLAB源代码

    以下是对每个算法的详细解释: 1. **Floyd算法**:也称为Floyd-Warshall算法,是一种用于求解所有顶点对之间最短路径的动态规划方法。它通过迭代更新的方式找出图中任意两点间的最短路径,对于有负权边的图,Floyd...

    Prim算法与Kruskal算法求最小生成树

    实验报告通常会包含以下几个部分: 1. **引言**:介绍最小生成树的概念,以及Prim和Kruskal算法的基本思想。 2. **算法描述**:详细解释两种算法的步骤,包括伪代码或流程图。 3. **实现细节**:展示如何用编程语言...

    python新手算法函数思想入门项目,包含几个小项目,没有程序基础可以根据这个开拓思维,会发现算法也挺好玩的,标有注解,一看就懂

    本入门项目包含几个小项目,旨在让新手逐步熟悉Python中的算法和函数。每个项目都带有注解,这有助于理解代码背后的逻辑。注解通常以`#`开始,它不会被Python解释器执行,但能为阅读代码的人提供信息。通过这些注解...

    求解这几个问题,几个递归算法中的问题,挺有意思的。

    在编程和算法设计中,递归是一种强大的工具,它通过函数自身调用来解决问题。递归通常用于解决可以被简化为相同子问题的问题,比如树的遍历、分治策略、动态规划等。以下是对给定标题和描述中涉及的递归算法问题的...

    用遗传算法解决TSP问题

    这通常会包括以下几个关键部分: 1. 初始化种群:随机生成一组城市顺序作为初始解,即第一代种群。 2. 适应度评估:计算每个个体(城市顺序)对应的路径长度,作为其适应度值。 3. 选择操作:根据适应度值进行选择...

    输油管道问题算法源程序

    在VC6.0环境下,这个算法能够很好地处理输油管道问题中涉及的大规模数据。 源程序的实现细节可能包括以下几个部分: 1. 数据结构:可能使用了数组或者链表来表示输油管道网络,每个节点代表一个管道或油库,边则...

    几个MATLAB经典算法

    数学建模中关于Matlab数学软件中几个经典的算法的程序

    改进的鱼群算法解决TSP问题

    在TSP问题中,鱼群算法的具体实现通常包括以下几个步骤: 1. 初始化:随机生成一定数量的“鱼”,代表旅行商可能的路径。每条“鱼”是一个解,由城市序列组成。 2. 觅食行为:每条鱼根据当前解的质量(即路径长度...

    常用的小算法-小问题的集成

    首先,我们来看一下几个常见的小算法: 1. **排序算法**:排序是计算机科学中最基本的问题之一,包括快速排序、归并排序、插入排序、冒泡排序、选择排序等。这些算法各有优劣,适用于不同的场景,如快速排序在...

    禁忌搜索背包问题,禁忌搜索算法解决背包问题,matlab

    该算法包含几个关键步骤: 1. **初始化**:首先,随机生成一个初始解,即一组物品的选择方案,计算其总价值和总体积。 2. **生成邻居解**:从当前解出发,通过某种方式(如交换两个物品、替换一个物品等)生成一个...

Global site tag (gtag.js) - Google Analytics