TCS课堂笔记:数据库存储问题

理论计算机(I)课上讲的一个问题,很有意思。

已经一个n,m和\{1,2,\cdots, m\}里n个数,设计一种保存这n个元素的表的数据结构形式,使得对\{1,2,\cdots, m\}中任何一个数,可以最少的查询次数(每次查询,可以选择一个位置,然后你能知道表中这个位置的数据),获知这个数是否在表中。

如果设计这个表为有序表,用二分法需要\log n次查询。

有序表是最优的么?

举一个例子,一个保存1,2,3里面的两个数的有序表,要想知道2是否在这个表里面,至少需要两次查询。可不可以用一种特定的数据结构,使得一次查询就能判定任何一个数是不是在数据库里面?

结论是可能的,见下图:

sorted table

一般的,假如表里的n个数的范围是1,2,...,2n-2,即m=2n-2,可以设计一种方法,使得,对于任何一个数,只需要查询一次,便能知道这个数是否在这个表里面。

课堂上有同学当场就想出设计方法,向他致敬!

另外,利用广义的Ramsey定理,对于固定的n,能够证明当m足够大时,无论你怎么设计那个表的结构,也至少需要\log n的查询次数。

一个很神奇的问题。相关论文Should Table be Sorted?, 上面的图片也来自这篇文章。

  • 征集3个人分蛋糕的方法 Yao在课程《理论计算机II》的第一节课上提到的一个问题: 三个人如何平分一块蛋糕? 要求每个人拿到不少于1/3的蛋糕——这里指的是每个人认为自...
  • 编程的核心是数据结构,而不是算法 Rob Pike, 最伟大的 C 语言大师之一 , 在Notes on C Programming(英文原文)中从另一个稍微不同的角度表述了 Unix 的哲学: 你无法断定程序会在什么地方耗费运...
  • 摸箱子问题以及在Static data structure problems上的应用 以前提到过,理论计算机这门课会邀请一些正在这边访问的教授来讲课,由于是本科生,所以这些教授一般都是讲些有趣的东西,比如之前的overhang 堆...
  • TCS: 拜占庭将军问题 (The Byzantine Generals Problem) 这个问题在Yao的理论计算机课上整整讨论了2节课。它是一个算法设计问题,也极具趣味性。下面是它的一些介绍和解决方案([1])。 拜占庭帝国就是5...
  • "完美"的洗牌次数 - 7次 在大家玩牌的时候,每一局之前都需要重新洗牌——一次洗牌指将牌分为左右两垛然后穿插放牌,但多少次洗牌才是正当的呢?就我多次打牌的观察,...
  • 最佳约会策略 题外话:最近阅微堂发的都是网友转发的政治方面的文章,不爱看的人会比较痛苦。现在讨论一个轻松一点的话题。其问题,已经被研究了很多年,有...
5条留言 -> 跳到留言表格
  • At 2007.05.08 18:57, xlambda said:

    一般的,假如表里的n个数的范围是1,2,...,2n-2,即m=2n-2,可以设计一种方法,使得,对于任何一个数,只需要查询一次,便能知道这个数是否在这个表里面。
    另外,利用广义的Ramsey定理,能够证明当m足够大时,无论你怎么设计那个表的结构,也至少需要\log n的查询次数。

    这两段没看懂,假如当m足够大时,并且m=2n-2,需要多少次查询呢?

    • At 2007.05.08 19:12, zhiqiang said:

      这两段不是连着的。后面那个是说当n固定,m足够大时,不会有比有序表更好的方法。

      • At 2007.05.09 00:16, You+XU said:

        这样行不行?
        模n 取同余, 把那些唯一的可以放到表里面去, 有重复的中间, 取出一半找那些空位置放(这个空位置我还没想好怎么找, 应该找那些取模剩余中间不包括的才好) 然后另一半如果放到原位, 就没法标记自己了, 所以可以错排一下放, 这样标记了自己也在里面.

        这样, 如果找到自己就是在里面, 如果找到和自己模N 取余一样的, 就表示不在自己里面. 如果遇到同余不一样的, 就看是前一半还是后一半, 前一半表示在里面, 后一半就表示自己不在里面.
        不过 2n-2 这些都没想通, 而且前一半后一半怎么区分呢, >n 么... 智商有限了...

        • At 2007.05.09 00:23, You+XU said:

          我说错了, 取模一样的不可能在自己格子里, 应该是看前一半还是后一般. 还有, 看过Andrew的了, 从证明到算法, 除了佩服没话说.

          • At 2008.03.21 17:37, lemonutzf said:

            HI 这是个有趣的问题。

            楼主能否给出这种情况的存储设计
            从集合{1,2,3,4,5,6}中选4个。

            (Required)
            (Required, not published)

              B | I | U | D | 添加链接 | 插入引用 | 插入代码 | 插入表情 | | + | ?
            guest | 注册 | BBS | 管理 | English | 繁體 | https

            阅微堂

            zhiqiang's personal blog
            Loading...
            Loading...
            Loading...