为什么 Domino Shuffling 算法是正确的

如果你关注我的博客,或者也对计数组合学感兴趣的话,那么应该听说了奇妙的多米诺洗牌算法。这个算法并不复杂,但是理解它的正确性可要花一番心思。本文就来介绍这个算法。

多米诺洗牌算法最早是由 Elkies, Propp, Larsen, Kuperberg 四人在 92 年的论文 ‘Alternating Sign Matrices and Domino Tilings‘ 一文中提出的,用来给出 Aztec Diamond 图的多米诺骨牌铺砌的计数的第四个解法。不过在那篇论文中他们对这个算法的正确性的证明比较晦涩(虽然是正确的),很多人不满意他们的证明,开始寻找更简单的方法。Propp 在 03 年发表了一篇论文 ‘Generalized Domino Tilings ‘,用更清楚的语言重新表述了一遍洗牌算法,可惜只是重述了一遍,对算法正确性证明中的关键一步避而不谈。我发信向 Propp 询问这个问题,他的回答是 ‘哦,很多人都注意到了这一点,不过好像还没有人给出简洁的证明,至于我自己,恐怕也很那想出比原来(指 92 年的论文)更好的证明‘。

万幸的是,Domino 论坛(一个 Propp 维护的邮件论坛,汇集了这个领域的许多专家)中还有高人。法国的 Jérémie Bouttier 热心的向我解释了他的方法,确实非常漂亮。

在介绍 Bouttier 的方法之前,我们先回顾一下什么是多米诺洗牌算法,以及这个算法核心的地方在哪里。

时间: 2024-12-31 05:47:47

为什么 Domino Shuffling 算法是正确的的相关文章

Aztec 钻石问题:Spider Move

这篇文章里要介绍的是非常精彩的 Aztec 钻石模型.我觉得这是一个可以进入 "数学天书" 的问题,它的表述简单而初等,但是却与计数组合学中许多最深刻美妙的问题有着千丝万缕的联系,当然它还有一个令人拍案叫绝的解法.所有这些不能不让我把它写出来和大家分享. 那么什么是 Aztec 钻石模型呢?很简单:依次把 $2,4,\cdots,2n$ 个方格摞在一起,然后关于 $x$ 轴对称地反射过去,得到的图形就叫 $n$ 阶 Aztec 钻石图 $AZ_n$:Aztec 钻石图的一个多米诺骨牌覆

Python + Matplotlib 绘制 Aztec Diamond 图的随机铺砌

一个 $n$ 阶的 Aztec Diamond 图,是指依次将 $2,4,\ldots,2n,2n,\ldots,4,2$ 个单位方格摞在一起得到的对称图形(于是图中一共有 $2n(n+1)$ 个单位方格).下图是 $n=5$ 时候的例子: 对一个 $n$ 阶的 Aztec Diamond 图,用 $1\times 2$ 的多米诺骨牌铺砌它,总共有 $2^{n(n+1)}$ 种不同的方法.(这里不考虑对称性,比如全部用水平的骨牌铺砌和全部用竖直的骨牌铺砌,两种方法是不同的) 一个有趣的问题是,对

图论常用算法之一 POJ图论题集【转载】

POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:http://poj.org/ 1062* 昂贵的聘礼 枚举等级限制+dijkstra 1087* A Plug for UNIX 2分匹配 1094 Sorting It All Out floyd 或 拓扑 1112* Team Them Up! 2分图染色+DP 1125 Stockbroker

【算法导论】插入排序

排序问题 输入:n个数的一个序列<a1, a2, ..., an> 输出:输入序列的一个排列<b1, b2, ..., bn>,满足 b1 ≤ b2 ≤ ... ≤ bn. 插入排序 对于插入排序,我们将其伪代码命名为Insertion-sort,其中的参数是一个数组A[1..n],包含长度为n的要排序的一个序列.(在代码中,A中元素的数目n用A.length来表示.)该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面.在过程Ins

普林斯顿公开课 算法2-1:排序概述

目标 对所有类型的数据进行排序. 问题 排序函数如何知道比较的是哪种类型的数据呢? 回调函数 这时候就需要引入回调函数的概念了.回调函数就是将可执行的代码作为参数进行传递. 实现回调的方法 在Java中可以通过接口来实现,在C语言中可以通过函数指针来实现,C++中可以通过class-type functor,也就是重载操作符operator ()的类,在C#中可以使用Delegate委托,在Python/Perl/ML/javascript中可以直接传递函数. JDK中提供了Comparable

shuffling

Shuffling is a procedure used to randomize a deck of playing cards to provide an element of chance in card games. Shuffling的目标是要Shuffling后所有可能情况的概率一样. Before: After: 这里介绍两种简单的shuffling算法: 1)Sort shuf?e : ?Generate a random real number for each array

关于Havel算法判断度数序列能否构成简单图的思考

问题描述: Given a list of n natural numbers d1, d2,...,dn, show how to decide in polynomial time whether there exists an undirected graph G = (V, E) whose node degrees are precisely the numbers d1,d2,···,dn. G should not contain multiple edges between th

麻将胡牌算法研究

麻将通常有13张牌,在打的时候随着吃,碰越来越少.总数应该维持在3*n + 1,n=0~4,比如1张,4张,7张或10张.胡牌时,加一张(可能是自摸或吃碰来的一张)组成n个顺子或暗刻,外加一个麻将对. 这里要研究的要点是: 1. 给出3n + 2张牌如何判断是否已经胡牌,所有的胡牌可能组合: 2. 如果给出3n+1张牌如何判断是否已经挺牌,挺哪些牌. 这两个问题其实主要是第一个问题,也就是如何判断3n +2 张牌是否胡牌的问题.后者可以简单地通过实验加34种麻将牌之一看是否胡牌来判断是否挺牌,以

【先进的算法】Lasvegas算法3SAT问题(C++实现代码)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46469557 1.SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前.先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使得A 为真. 显然, 假设A 为真, 则 CNF 的每一个子句中必有一个命题变元为 1 (真