zoukankan      html  css  js  c++  java
  • 《Python 算法教程》笔记

    # 找明星问题
    # 10个人中只有一个明星,大家都认识明星,明星不认识任何人。
    
    from random import randrange
    
    #直接法,两两判断
    def naive_celeb(G):
        n = len(G)
        for u in range(n):
            for v in range(n):
                if u == v: continue
                if G[u][v]: break
                if not G[v][u]: break
            else:
                return u
    
    #优化思路:G[u][v]为真,说明u肯定不是明星,否则v肯定不是明星
    def celeb(G):
        u,v = 0,1
        n = len(G)
        for c in range(2,n+1): #从第3个开始 以次判断
            if G[u][v]:  #如果u认识v,则u肯定不是明星,往后累加
                u = c
            else:
                v = c #否则u可能是明星,v肯定不是明星,往后累加
        if u == n: #累加到最后,只剩下u和v,u不是明星,说明v是明星
            c = v
        else:
            c = u
    
        #其实到这里已经能确定c就是明星了,下面的过程再判断一遍
    
        for v in range(n):
            if c == v:
                continue
            if G[c][v]: break
            if not G[v][c]: break
        else:
            return c
        return None
    
    
    n = 10 #人数
    
    # 构造数据结构,使用二维数组
    G = [[randrange(2) for i in range(10)] for i in range(10)]
    
    c = randrange(10) # 指定一位明星
    print(c)
    
    #设置关系
    for i in range(10):
        G[i][c] = True #所有人都认识明星
        G[c][i] = False #明星不认识所有人
    
    for i in G:
        print(i)
    
    cc = naive_celeb(G)
    print(cc)
    
    cc = celeb(G)
    print(cc)
    
  • 相关阅读:
    系统引导管理器GRUB,为初学者指南
    PHPBB安装
    python的装饰器
    PIL的问题解决
    python的小技巧
    强烈推荐instagram的ppt
    新的一天
    OpenStack介绍
    ansible自动化运维工具
    .net连oracle的问题
  • 原文地址:https://www.cnblogs.com/bvac/p/6382761.html
Copyright © 2011-2022 走看看