青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A Za, A Za, Fighting...

堅信:勤能補拙

[zz] 變進制數與全排列哈希

我們經常使用的數的進制為“常數進制”,即始終逢p進1。例如,p進制數K可表示為
    K = a0*p^0 + a1*p^1 + a2*p^2 + ... + an*p^n (其中0 <= ai <= p-1),
它可以表示任何一個自然數。

對于這種常數進制表示法,以及各種進制之間的轉換大家應該是很熟悉的了,但大家可能很少聽說變進制數。這里我要介紹一種特殊的變進制數,它能夠被用來實現全排列的Hash函數,并且該Hash函數能夠實現完美的防碰撞和空間利用(不會發生碰撞,且所有空間被完全使用,不多不少)。這種全排列Hash函數也被稱為全排列數化技術。下面,我們就來看看這種變進制數。

我們考查這樣一種變進制數:第1位逢2進1,第2位逢3進1,……,第n位逢n+1進1。它的表示形式為
    K = a1*1! + a2*2! + a3*3! + ... + an*n! (其中0 <= ai <= i),
也可以擴展為如下形式(因為按定義a0始終為0),以與p進制表示相對應:
    K = a0*0! + a1*1! + a2*2! + a3*3! + ... + an*n! (其中0 <= ai <= i)。
(后面的變進制數均指這種變進制數,且采用前一種表示法)

先讓我們來考查一下該變進制數的進位是否正確。假設變進制數K的第i位ai為i+1,需要進位,而ai*i!=(i+1)*i!=1*(i+1)!,即正確的向高位進1。這說明該變進制數能夠正確進位,從而是一種合法的計數方式。

接下來我們考查n位變進制數K的性質:
(1)當所有位ai均為i時,此時K有最大值
    MAX[K] = 1*1! + 2*2! + 3*3! + ... + n*n!
           = 1! + 1*1! + 2*2! + 3*3! + ... + n*n! - 1
           = (1+1)*1! + 2*2! + 3*3! + ... + n*n! - 1
           = 2! + 2*2! + 3*3! + ... + n*n! - 1
           = ...
           = (n+1)!-1
    因此,n位K進制數的最大值為(n+1)!-1。
(2)當所有位ai均為0時,此時K有最小值0。
因此,n位變進制數能夠表示0到(n+1)!-1的范圍內的所有自然數,共(n+1)!個。

在一些狀態空間搜索算法中,我們需要快速判斷某個狀態是否已經出現,此時常常使用Hash函數來實現。其中,有一類特殊的狀態空間,它們是由全排列產生的,比如N數碼問題。對于n個元素的全排列,共產生n!個不同的排列或狀態。下面將討論如何使用這里的變進制數來實現一個針對全排列的Hash函數。

從數的角度來看,全排列和變進制數都用到了階乘。如果我們能夠用0到n!-1這n!個連續的變進制數來表示n個元素的所有排列,那么就能夠把全排列完全地數化,建立起全排列和自然數之間一一對應的關系,也就實現了一個完美的Hash函數。那么,我們的想法能否實現呢?答案是肯定的,下面將進行討論。

假設我們有b0,b1,b2,b3,...,bn共n+1個不同的元素,并假設各元素之間有一種次序關系 b0<b1<b2<...<bn。對它們進行全排列,共產生(n+1)!種不同的排列。對于產生的任一排列 c0,c1,c2,..,cn,其中第i個元素ci(1 <= i <= n)與它前面的i個元素構成的逆序對的個數為di(0 <= di <= i),那么我們得到一個逆序數序列d1,d2,...,dn(0 <= di <= i)。這不就是前面的n位變進制數的各個位么?于是,我們用n位變進制數M來表示該排列:
   M = d1*1! + d2*2! + ... + dn*n!
因此,每個排列都可以按這種方式表示成一個n位變進制數。下面,我們來考查n位變進制數能否與n+1個元素的全排列建立起一一對應的關系。

由于n位變進制數能表示(n+1)!個不同的數,而n+1個元素的全排列剛好有(n+1)!個不同的排列,且每一個排列都已經能表示成一個n位變進制數。如果我們能夠證明任意兩個不同的排列產生兩個不同的變進制數,那么我們就可以得出結論:

★ 定理1 n+1個元素的全排列的每一個排列對應著一個不同的n位變進制數。

對于全排列的任意兩個不同的排列p0,p1,p2,...,pn(排列P)和q0,q1,q2,...,qn(排列Q),從后往前查找第一個不相同的元素,分別記為pi和qi(0 < i <= n)。
(1)如果qi > pi,那么,
如果在排列Q中qi之前的元素x與qi構成逆序對,即有x > qi,則在排列P中pi之前也有相同元素x > pi(因為x > qi且qi > pi),即在排列P中pi之前的元素x也與pi構成逆序對,所以pi的逆序數大于等于qi的逆序數。又qi與pi在排列P中構成pi的逆序對,所以pi的逆序數大于qi的逆序數。
(2)同理,如果pi > qi,那么qi的逆序數大于pi的逆序數。
因此,由(1)和(2)知,排列P和排列Q對應的變進制數至少有第i位不相同,即全排列的任意兩個不同的排列具有不同的變進制數。至此,定理1得證。

計算n個元素的一個排列的變進制數的算法大致如下(時間復雜度為O(n^2)):
template <typename T>
size_t PermutationToNumber(const T permutation[], int n)
{
    // n不能太大,否則會溢出(如果size_t為32位,則n <= 12)
    size_t result = 0;
    for (int j = 1; j < n; ++j) {
        int count = 0;
        for (int k = 0; k < j; ++k) {
            if (permutation[k] > permutation[j])
                ++count;
        }
        // factorials[j]保存著j!
        result += count * factorials[j];
    }

    return result;
}

說明:
(1)由于n!是一個很大的數,因此一般只能用于較小的n。
(2)有了計算排列的變進制數的算法,我們就可以使用一個大小為n!的數組來保存每一個排列的狀態,使用排列的變進制數作為數組下標,從而實現狀態的快速檢索。如果只是標記狀態是否出現,則可以用一位來標記狀態。

posted on 2010-08-06 10:30 simplyzhao 閱讀(394) 評論(0)  編輯 收藏 引用 所屬分類: G_其他

導航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产日韩xxxxx| 国产日产欧产精品推荐色 | 亚洲一区精品视频| 国产精品99久久久久久久久| 亚洲深夜福利视频| 久久久噜噜噜久噜久久| 国产精品毛片va一区二区三区| 欧美日韩一区二区三区在线观看免| 欧美成人国产| 欧美午夜片在线免费观看| 国产精品天天摸av网| 国内精品视频久久| 亚洲娇小video精品| 一本色道久久综合亚洲二区三区| 亚洲性视频h| 久久野战av| 亚洲人在线视频| av成人免费| 久久精品99无色码中文字幕| 美女图片一区二区| 国产精品免费观看在线| 在线成人av| 亚洲欧美在线播放| 欧美高清一区二区| 亚洲欧美日韩中文播放| 欧美激情一区二区三区四区| 国产欧美在线视频| 亚洲小说欧美另类婷婷| 免费在线成人av| 在线综合视频| 欧美成人dvd在线视频| 国产毛片一区二区| 一本色道久久88综合日韩精品 | 另类尿喷潮videofree| 日韩视频在线免费| 麻豆精品在线视频| 国产麻豆午夜三级精品| 一区二区三区日韩| 久久亚洲图片| 亚洲女同在线| 国产精品v欧美精品v日韩精品| 精东粉嫩av免费一区二区三区| 亚洲一区在线观看视频| 亚洲欧洲日产国产网站| 久久久综合视频| 国产欧美精品一区二区三区介绍 | 久久综合婷婷| 亚洲欧美日韩精品久久| 欧美日韩一区二区三区在线看| 亚洲国产精品电影在线观看| 久久久久久97三级| 亚洲欧美激情诱惑| 国产精品一二一区| 亚洲欧美日韩第一区| 亚洲美女性视频| 欧美成人一区二区| 最新成人在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美久久久久久久| 国产精品一区二区三区四区 | 欧美成人嫩草网站| 亚洲福利视频一区| 欧美成人免费全部| 久久夜色精品国产欧美乱| 激情综合中文娱乐网| 久久精品人人做人人综合 | 欧美专区一区二区三区| 国产主播喷水一区二区| 久久久久久免费| 欧美中在线观看| 在线观看日韩专区| 亚洲国产你懂的| 欧美日韩在线另类| 亚洲综合色噜噜狠狠| 亚洲欧美久久久久一区二区三区| 国产毛片一区| 免费一区二区三区| 欧美日本成人| 欧美一区二区高清| 久久久久久亚洲精品杨幂换脸| 亚洲激情成人在线| 9l视频自拍蝌蚪9l视频成人| 欧美午夜在线一二页| 久久九九国产精品怡红院| 看欧美日韩国产| 亚洲一区二区三区色| 欧美亚洲专区| 99pao成人国产永久免费视频| 亚洲午夜激情网站| 亚洲国产99| 在线亚洲高清视频| 一区二区三区在线看| 亚洲精品美女91| 国产在线精品一区二区夜色| 欧美高清在线精品一区| 久久中文字幕一区| 在线亚洲免费视频| 翔田千里一区二区| 亚洲巨乳在线| 欧美在线观看日本一区| 日韩一二在线观看| 久久精品一二三| 亚洲午夜久久久| 久久综合九色综合久99| 亚洲欧美日韩中文在线制服| 另类春色校园亚洲| 久久精品亚洲精品国产欧美kt∨| 欧美日本一道本| 欧美国产日韩一区| 国内精品久久久久久| aaa亚洲精品一二三区| 亚洲人成久久| 久久综合影音| 久久久免费av| 国产精品一卡二卡| 这里只有精品丝袜| 中文欧美日韩| 欧美日本中文| 亚洲激情婷婷| 亚洲免费观看视频| 久久久久国产成人精品亚洲午夜| 国产欧美在线看| 亚洲第一页中文字幕| 韩日精品中文字幕| 亚洲男女自偷自拍图片另类| 99re热这里只有精品免费视频| 久久激情五月丁香伊人| 欧美在线视频观看免费网站| 国产精品国码视频| av成人动漫| 亚洲资源av| 欧美日韩免费高清一区色橹橹| 欧美黄在线观看| 亚洲国产小视频在线观看| 久久久一本精品99久久精品66| 久久视频国产精品免费视频在线| 国产欧美亚洲视频| 欧美一区二区精品| 久久久综合网站| 极品少妇一区二区三区| 久久爱www久久做| 久热精品在线视频| 狠狠色综合色综合网络| 久久久久久久999| 欧美gay视频| 最新国产乱人伦偷精品免费网站| 久久影院亚洲| 亚洲激情影院| 国产精品99久久久久久宅男| 欧美日韩亚洲91| 亚洲自拍高清| 另类人畜视频在线| 亚洲巨乳在线| 国产精品久久久久久福利一牛影视| 亚洲天堂网站在线观看视频| 午夜宅男久久久| 国产亚洲精品7777| 老**午夜毛片一区二区三区| 亚洲激情第一区| 午夜精品剧场| 亚洲第一在线综合网站| 欧美国产日韩亚洲一区| 中文精品在线| 男同欧美伦乱| 亚洲自拍偷拍一区| 一区二区在线视频| 欧美日韩国产二区| 亚洲欧美视频| 亚洲国产女人aaa毛片在线| 亚洲欧美日韩精品久久久| 狠狠色综合网| 欧美日韩一区二区高清| 亚洲欧美日韩中文视频| 亚洲国产福利在线| 亚洲欧美综合网| 亚洲国产一区二区在线| 国产精品美女久久久久久2018| 久久视频一区| 亚洲午夜精品久久久久久浪潮| 久久久久成人精品| 一区二区欧美亚洲| 亚洲成人资源网| 国产精品免费看| 欧美激情一区二区三区在线视频| 先锋亚洲精品| 夜夜嗨一区二区三区| 欧美高清在线一区二区| 午夜视频久久久| 夜夜嗨av一区二区三区中文字幕| 国产一区二区三区成人欧美日韩在线观看| 欧美高清视频www夜色资源网| 亚洲综合精品一区二区| 好看的av在线不卡观看| 国产主播精品| 欧美另类极品videosbest最新版本| 亚洲欧美另类久久久精品2019| 亚洲乱码一区二区| 欧美激情久久久久久| 免费人成精品欧美精品| 久久不射中文字幕|