zoukankan      html  css  js  c++  java
  • 给你出道题---N个数字的静态决策区分问题

    决策,是世界上最重要的事情。
    走路分两步:看准方向,大步前进。看准方向的过程就是决策。
    任何一个问题,都对应两个空间:解空间和决策空间。我们所要做的就是使用决策空间去划分解空间。
    决策可以分成两类:单步决策和多步决策。单步决策只需要做一次决策即可,多步决策需要做多次决策,需要考虑决策之间的连贯性。
    对于一些有步骤的连续决策问题,决策可以用树形结构来描述。每次执行决策之后,不同的分支会采取不同的后继决策,这称之为动态决策。特殊地,有一类决策是链状结构,不需要根据实际情况做出调整,这称之为静态决策。动态决策形成决策树,静态决策形成决策链,链表是特殊的树,静态决策是特殊地动态决策。因为静态决策形成的是决策链,所以静态决策满足无序性,先执行哪步决策都可以。

    编程有三种结构:顺序、循环、条件。动态决策就是有条件语句,静态决策就是没有条件语句。

    言归正传,请看问题。
    给定N个100bit的二进制数字,至少需要多少位才能判别它们?(静态决策)

    这个问题直观看上去像贪心。在100个bit中,每次选择区分度最大的bit添加到决策链中。

    首先选择b1,N个数字分成了两叉;然后选择b2,分成四叉。那么如何选择b1、b2呢?

    N个100bit的二进制数字,构成了N行100列的矩阵。

    假设第一次我选择b1之后,把全部数字分成两组,每组的个数分别为c1、c2。那么c1和c2越均衡越好。怎么算是均衡?$frac{c_1}{N} imes c_1+frac{c_2}{N} imes c_2$越小越好。这个式子表示随机选择一个数字x,与x相同的数字的个数。与x相同的个数当然是越少越好,这表示我们的程序已经能够把数字区分开了。

    假设第二次我选择b2之后,把全部数字分成四组,每组的个数分别为c1、c2、c3、c4,这四个数字平方之和越小越好。

    上述解法只是一种贪心,不知道贪心的结果是否正确。不知道是否有完美的方法。

  • 相关阅读:
    【LeetCode】205. Isomorphic Strings
    Syscall param open(filename) points to unaddressable byte(s)
    五种主要多核并行编程方法分析与比较
    计算机时间复杂度和空间复杂度
    CUDA学习笔记(二)【转】
    CUDA学习笔记(一)【转】
    CUDA Thread Indexing
    Intel MKL函数,如何得到相同的计算结果?【转】
    CUDA编程
    GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9333708.html
Copyright © 2011-2022 走看看