`
lixiao
  • 浏览: 14550 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

请问这个问题的算法如何优化

阅读更多
1000个人,分两种:好人坏人。里面最少有501个是好人。
如果抽出来两个人,那么好人会说出另外一个人到底是好人还是坏人,而坏人的答案是不确定的。(类似于真话假话)
现在要用一个算法,找出一个一定是好人的人

最简单的方法:
那一个人出来和所有人放一起
如果超过501个人说他是好的,那他一定是好的,否则一定是坏的
这样的方法是可行的,但是复杂度是n方

要求要优化到n
想了半天都没想出来了,请高手支招

问题的关键是:一定要考虑最差情况。
分享到:
评论
6 楼 cash-007 2007-12-12  
想明白了,真是太厉害了!!!
5 楼 fengzl 2007-10-18  
不错受教了,才思敏捷阿
4 楼 lixiao 2007-10-18  
谢谢eastsun
最近比较忙~
那天看了你的思路,觉得确实厉害~
而且居然马上写了个程序。。呵呵~厉害的~~
今天刚把程序仔细又研究了一遍,跑上来再次感谢~
3 楼 jasongreen 2007-10-16  
强人。。强

(i)A中的人数是奇数,此时可以证明A中的好人比坏人多
(ii)A中的人数是偶数,将第一个人加进来,可以证明这个队的好人比坏人多.

这个证明过程很重要,思路的关键
2 楼 Eastsun 2007-10-10  
写了个代码演示:
import java.util.Random;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
/**
   演示代码
   @author Eastsun
   @version 1.0 2007/10/10
*/

public class GoodORBad{
    public static void main(String[] args){
        Man[] mans =new Man[5000];
        mans[0] =new Man(true);
        mans[1] =new Man(true);
        for(int index =2;index<mans.length;index++) mans[index] =new Man(index%2==0);
        List<Man> list =Arrays.asList(mans);
        //将mans的顺序打乱
        Collections.shuffle(list);
        
        Man m =choiceAGoodMan(mans);
        m.say();
    }
    /**
       从mans中选出一个好人,注意此方法将修改数组mans
    */
    public static Man choiceAGoodMan(Man[] mans){
        int remainder =mans.length;
        while(remainder>2){
            int i =0,j =0;
            while(i+1<remainder){
                Man a =mans[i], b=mans[i+1];
                i += 2;
                if(a.isGood(b)&&b.isGood(a)){ 
                    mans[j++] =a;
                }
            }
            if(i<remainder&&j%2==0){
                mans[j++] =mans[i];
            }
            remainder =j;
        }
        return mans[0];
    }
}

class Man{
    private static Random R =new Random();
    private boolean isGood;
    
    /**
      构造一个好人或坏人
    */
    public Man(boolean isGood){
        this.isGood =isGood;
    }
    /**
      判断other是否好人
      如果本身是坏人,就信口胡说
    */
    public boolean isGood(Man other){
        if(isGood) return other.isGood;
        else       return R.nextInt(2) ==0;
    }
    /**
      自己揭开面纱
    */
    public void say(){
        System.out.println(isGood?"Hey,I'm a good man!":"Hey,I'm a bad man!");
    }
}
1 楼 Eastsun 2007-10-10  
有点意思,貌似在<算法导论>上见过..
下面考虑一般的情况:
n个人,超过[n/2]的人是好人,从中找出一个好人
(1) n =1,2时全是好人
(2) n =2*m +1 时:
    将第一个晾在一边,剩下的两两配成m对
    对(a,b)两人互相提问,若至少有一人说对方是坏人,则其中至少有一个是坏人.若两人都说对方是好人,则两人要么全是坏人,要么全是好人.从后一种配对中每个挑出一个来组成一个队A
    (i)A中的人数是奇数,此时可以证明A中的好人比坏人多
    (ii)A中的人数是偶数,将第一个人加进来,可以证明这个队的好人比坏人多.
  总之,我们可以得到一个新的队,其人数<=m+1,且性质不变(好人比坏人多)
(3)n =2*m 和(2)差不多,更简单,略之

这样:我们在O(n)时间内把问题缩小到原规模的1/2

......
如此,在O(n)时间内可以解决问题.

相关推荐

    遗传算法优化BP神经网络-遗传算法优化BP.rar

    遗传算法优化BP神经网络-遗传算法优化BP.rar 遗传算法优化BP.rar 我有输入和输出数据,想用遗传算法优化BP网络的方法对这些数据进行训练,要求测试相对误差,我用《matlab三十案例》里现成的...

    【智能优化算法-白鲨优化算法】基于白鲨优化算法求解单目标优化问题(WSO)含Matlab源码.zip

    在这个资料包中,包含的是使用Matlab编程语言实现的白鲨优化算法,可用于理解和应用该算法。 一、白鲨优化算法原理 白鲨优化算法模拟了白鲨在海洋中的捕食行为。在算法中,白鲨代表搜索个体,而鱼群代表可能的解决...

    黏菌优化算法黏菌优化算法黏菌优化算法测试函数

    黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化算法黏菌优化算法测试函数 黏菌优化算法黏菌优化...

    遗传算法无约束函数优化问题,Ackley函数优化与讨论

    文件"演化计算报告.doc"可能包含了关于遗传算法优化 Ackley 函数的详细过程、结果分析以及可能的优化策略。而"Ackley8维"、"Ackley4维"可能分别对应不同维度下 Ackley 函数的实例,展示在不同复杂度下的优化效果。 ...

    狼群算法MATLAB.zip_matlab 狼群算法_最优化算法_狼群_狼群算法_狼群算法优化

    总的来说,这个压缩包提供的资源对于想要在MATLAB环境中学习和应用狼群算法进行最优化问题解决的用户来说是宝贵的。通过阅读和理解提供的文档,用户能够掌握如何利用狼群算法解决实际的最优化问题,特别是在特征提取...

    遗传算法优化问题

    遗传算法优化问题 遗传算法是现代优化算法中的一种,通过模拟生物进化的过程来搜索最优解。遗传算法的优化问题是指使用遗传算法来解决多元单峰函数优化、多元多峰函数优化等问题。 遗传算法工具箱的认识 在实验中...

    【智能优化算法-天鹰优化算法】基于天鹰优化算法求解单目标优化问题附matlab代码AO.zip

    标题中的“智能优化算法-天鹰优化算法”指的是天鹰优化算法(Astraea Optimization Algorithm,AO),这是一种受到自然界天鹰飞行模式启发的全局优化算法,用于解决复杂的单目标优化问题。这种算法模拟了天鹰在寻找...

    一种新兴的群智能优化算法,斑马优化算法(2022)

    斑马优化算法(Zebra Optimization Algorithm, 简称ZOA)是一种近年来提出的新型全局优化方法,它借鉴了自然界中斑马群体的行为模式,通过模拟斑马在草原上的觅食、防御和群体互动来解决复杂优化问题。这种算法在...

    代码 基于遗传算法的Bp神经网络优化算法代码

    代码 基于遗传算法的Bp神经网络优化算法代码代码 基于遗传算法的Bp神经网络优化算法代码代码 基于遗传算法的Bp神经网络优化算法代码代码 基于遗传算法的Bp神经网络优化算法代码代码 基于遗传算法的Bp神经网络优化...

    智能优化算法 课件

    智能优化算法是一类用于解决最优化问题的计算方法,它们主要针对那些...在计算复杂性理论中,NP完全问题的提出揭示了许多实际问题难以在多项式时间内找到确定性算法求解,这也进一步促进了智能优化算法的研究和发展。

    退火遗传算法优化BP神经网络(用改进的模拟退火遗传算法优化BP神经网络的研究)

    总之,这个研究通过改进的退火遗传算法优化BP神经网络,旨在解决传统BP网络的优化难题,提高预测或分类的准确性和效率。对于希望在神经网络优化领域进行研究的人来说,这是一个值得参考的案例。

    【非洲秃鹫优化算法】基于非洲秃鹫优化算法求解单目标优化问题(AVOA)含Matlab源码.zip

    通过阅读这份文档,可以深入学习算法的细节,以及如何在实际问题中应用AVOA进行优化。 总的来说,非洲秃鹫优化算法是生物启发式优化算法的一种,其独特的行为模拟策略使其在解决复杂优化问题时具有较高的潜力。结合...

    灰狼优化算法和粒子群优化算法比较

    标题中的“灰狼优化算法和粒子群优化算法比较”指的是在优化问题中,对两种流行的启发式算法——灰狼优化算法(Grey Wolf Optimizer, GWO)与粒子群优化算法(Particle Swarm Optimization, PSO)的性能进行分析和...

    基于鲸鱼优化算法优化VMD参数试看效果代码(目标函数为样本熵)

    **基于鲸鱼优化算法优化VMD参数试看效果代码(目标函数为样本熵)** 振动模态分解(Vibration Mode Decomposition,VMD)是一种非线性、无须预先确定分解阶数的时间序列分析方法,它能将复杂信号分解成一系列具有单一...

    各种优化算法解决TSP问题

    在MATLAB中,`ant_colony_system.m` 文件很可能实现了这个算法,通过模拟蚂蚁释放信息素和选择路径的过程,逐步优化旅行商路径。 2. **遗传算法(Genetic Algorithm, GA)**:遗传算法是受到生物进化过程启发的搜索...

    计算机和算法优化

    计算机和算法优化是信息技术领域的重要组成部分,特别是在解决复杂问题时起着至关重要的作用。优化技术是一种利用数学原理来寻找最佳解决方案的技术,广泛应用于系统控制、人工智能、模式识别、生产调度、VLSI技术和...

    结合白鲸优化算法和NSGAII算法实现了多目标白鲸优化算法

    总的来说,这个资源为研究者和工程师提供了一个强大的工具,可以有效地解决多目标优化问题,无论是无约束还是有约束条件。通过结合白鲸优化算法的动态搜索能力和NSGA-II的非支配排序策略,用户可以期待获得更优的...

    遗传算法优化BP神经网络完整实例

    这个实例对于理解和应用遗传算法优化BP神经网络有很好的参考价值,可以作为研究和实践的基础。通过深入学习和理解这部分内容,开发者能够更好地解决实际问题,尤其是在面对复杂优化问题时,能够提高模型的训练效率和...

    数据库查询优化算法

    下面将详细介绍这三种算法及其在实际应用中的作用。 1. 基于成本的优化(Cost-Based Optimization, CBO) 基于成本的优化算法是最常用的一种查询优化策略。CBO首先通过统计信息(如表的大小、索引分布、列的基数等...

    Matlab优化算法PDF

    这份文档详尽地阐述了如何利用Matlab的强大功能解决各种实际问题中的优化问题,包括但不限于最小化函数、最大化目标、约束优化以及多目标优化等。 优化算法在计算机科学、工程计算、数据分析等领域有着广泛的应用,...

Global site tag (gtag.js) - Google Analytics