1. 程式人生 > 實用技巧 >RMAN 備份還原異機(單機環境)

RMAN 備份還原異機(單機環境)

卡塔蘭數

卡塔蘭數是組合數學中一個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁·查理·卡塔蘭(18141894)命名。

卡塔蘭數的一般項公式為 另類遞迴式: h(n)=((4*n-2)/(n+1))*h(n-1);

前幾項為 (OEIS中的數列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670,

129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

[編輯]性質

Cn的另一個表達形式為所以,Cn是一個自然數;這一點在先前的通項公式中並不顯而易見。

這個表達形式也是André對前一公式證明的基礎。(見下文的第二個證明。)

卡塔蘭數滿足以下遞推關係

它也滿足

這提供了一個更快速的方法來計算卡塔蘭數。

卡塔蘭數的漸近增長為

它的含義是左式除以右式的商趨向於1當n→∞。(這可以用n!的斯特靈公式來證明。)

所有的奇卡塔蘭數Cn都滿足n= 2k− 1。所有其他的卡塔蘭數都是偶數。

應用

組合數學中有非常多.的組合結構可以用卡塔蘭數來計數。在Richard P. Stanley的Enumerative Combinatorics: Volume 2一書的習題中

包括了66個相異的可由卡塔蘭數表達的組合結構。以下用Cn=3和Cn=4舉若干例:

  • Cn表示長度2n的dyck word的個數。Dyck word是一個有n個X和n個Y組成的字串,且所有的部分字串皆滿足X的個數大於等於Y的個數。
  • 以下為長度為6的dyck words:
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
  • 將上例的X換成左括號,Y換成右括號,Cn表示所有包含n組括號的合法運算式的個數:
((())) ()(()) ()()() (())() (()())
  • Cn表示有n+1個葉子的二叉樹的個數。

  • Cn表示所有不同構的含n個分枝結點的滿二叉樹的個數。(一個有根二叉樹是滿的當且僅當每個結點都有兩個子樹或沒有子樹。)

證明:

令1表示進棧,0表示出棧,則可轉化為求一個2n位、含n個1、n個0的二進位制數,滿足從左往右掃描到任意一位時,經過的0數不多於1數。

顯然含n個1、n個0的2n位二進位制數共有個,下面考慮不滿足要求的數目.

考慮一個含n個1、n個0的2n位二進位制數,掃描到第2m+1位上時有m+1個0和m個1(容易證明一定存在這樣的情況),則後面的0-1排列中

必有n-m個1和n-m-1個0。將2m+2及其以後的部分0變成1、1變成0,則對應一個n+1個0和n-1個1的二進位制數。

反之亦然(相似的思路證明兩者一一對應)。

從而。證畢。

  • Cn表示所有在n×n格點中不越過對角線的單調路徑的個數。一個單調路徑從格點左下角出發,在格點右上角結束,每一步均為向上或
  • 向右。計算這種路徑的個數等價於計算Dyck word的個數: X代表“向右”,Y代表“向上”。下圖為n= 4的情況:
  • Cn表示通過連結頂點而將n+2邊的凸多邊形分成三角形的方法個數。下圖中為n= 4的情況:

  • Cn表示對{1, ...,n}依序進出置換個數。一個置換w是依序進出棧的當S(w) = (1, ...,n), 其中S(w)遞迴定義如下:令w=unv,其中nw
  • 最大元素,uv為更短的數列;再令S(w) =S(u)S(v)n,其中S為所有含一個元素的數列的單位元。
  • Cn表示用n個長方形填充一個高度為n的階梯狀圖形的方法個數。下圖為n=4的情況:



百度百科資料:
簡介

  中文:卡特蘭數
  Catalan數是組合數學中一個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁·查理·卡塔蘭(1814–1894)命名。
  原理:
  令h(0)=1,h(1)=1,catalan數滿足遞迴式:
  h(n)=h(0)*h(n-1)+h(1)*h(n-2)++h(n-1)h(0)(其中n>=2)
  該遞推關係的解為:
  h(n)=C(2n,n)/(n+1)(n=1,2,3,)
另類遞迴式: h(n)=((4*n-2)/(n+1))*h(n-1);
  
  前幾項為(OEIS中的數列A000108):1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790,477638700,1767263190,6564120420,24466267020,91482563640,343059613650,1289904147324,4861946401452,
應用

  我總結了一下,最典型的四類應用:(實質上卻都一樣,無非是遞迴等式的應用,就看你能不能分解問題寫出遞迴式了)
1.括號化問題。

  矩陣鏈乘:P=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)
2.出棧次序問題。

  一個棧(無窮大)的進棧序列為1,2,3,..n,有多少個不同的出棧序列?
  類似:
  (1)有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)
  (2)在圓上選擇2n個點,將這些點成對連線起來,使得所得到的n條線段不相交的方法數。
3.將多邊行劃分為三角形問題。

  將一個凸多邊形區域分成三角形區域的方法數?
  類似:一位大城市的律師在她住所以北n個街區和以東n個街區處工作。每天她走2n個街區去上班。如果她
  從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?
  類似:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?
4.給頂節點組成二叉樹的問題。

  給定N個節點,能構成多少種形狀不同的二叉樹?
  (一定是二叉樹!
  先去一個點作為頂點,然後左邊依次可以取0至N-1個相對應的,右邊是N-1到0個,兩兩配對相乘,就是h(0)*h(n-1)+h(2)*h(n-2)++h(n-1)h(0)=h(n))
  (能構成h(N)個)

經典例題:

1. hdu 4828

  1 //#include <bits/stdc++.h>
  2 #include <time.h>
  3 #include <set>
  4 #include <map>
  5 #include <stack>
  6 #include <cmath>
  7 #include <queue>
  8 #include <cstdio>
  9 #include <string>
 10 #include <vector>
 11 #include <cstring>
 12 #include <utility>
 13 #include <cstring>
 14 #include <iostream>
 15 #include <algorithm>
 16 #include <list>
 17 using namespace std;
 18 #define eps 1e-10
 19 #define PI acos(-1.0)
 20 #define lowbit(x) ((x)&(-x))
 21 #define zero(x) (((x)>0?(x):-(x))<eps)
 22 #define mem(s,n) memset(s,n,sizeof s);
 23 #define ios {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
 24 typedef long long ll;
 25 typedef unsigned long long ull;
 26 const int maxn=1e6+5;
 27 const int Inf=0x7f7f7f7f;
 28 const ll mod=1e9+7;
 29 //const int N=3e3+5;
 30 bool isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; }//判斷一個數是不是 2 的正整數次冪
 31 int modPowerOfTwo(int x, int mod) { return x & (mod - 1); }//對 2 的非負整數次冪取模
 32 int getBit(int a, int b) { return (a >> b) & 1; }// 獲取 a 的第 b 位,最低位編號為 0
 33 int Max(int a, int b) { return b & ((a - b) >> 31) | a & (~(a - b) >> 31); }// 如果 a>=b,(a-b)>>31 為 0,否則為 -1
 34 int Min(int a, int b) { return a & ((a - b) >> 31) | b & (~(a - b) >> 31); }
 35 ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
 36 ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
 37 int Abs(int n) {
 38   return (n ^ (n >> 31)) - (n >> 31);
 39   /* n>>31 取得 n 的符號,若 n 為正數,n>>31 等於 0,若 n 為負數,n>>31 等於 -1
 40      若 n 為正數 n^0=n, 數不變,若 n 為負數有 n^(-1)
 41      需要計算 n 和 -1 的補碼,然後進行異或運算,
 42      結果 n 變號並且為 n 的絕對值減 1,再減去 -1 就是絕對值 */
 43 }
 44 ll binpow(ll a, ll b,ll c) {
 45   ll res = 1;
 46   while (b > 0) {
 47     if (b & 1) res = res * a%c;
 48     a = a * a%c;
 49     b >>= 1;
 50   }
 51   return res%c;
 52 }
 53 void extend_gcd(ll a,ll b,ll &x,ll &y)
 54 {
 55     if(b==0) {
 56         x=1,y=0;
 57         return;
 58     }
 59     extend_gcd(b,a%b,x,y);
 60     ll tmp=x;
 61     x=y;
 62     y=tmp-(a/b)*y;
 63 }
 64 ll mod_inverse(ll a,ll m)
 65 {
 66     ll x,y;
 67     extend_gcd(a,m,x,y);
 68     return (m+x%m)%m;
 69 }
 70 ll eulor(ll x)
 71 {
 72    ll cnt=x;
 73    ll ma=sqrt(x);
 74    for(int i=2;i<=ma;i++)
 75    {
 76     if(x%i==0) cnt=cnt/i*(i-1);
 77     while(x%i==0) x/=i;
 78    }
 79    if(x>1) cnt=cnt/x*(x-1);
 80    return cnt;
 81 }
 82 ll inv[maxn],f[maxn];
 83 void init()
 84 {
 85     inv[1]=1;
 86     for(int i=2;i<maxn-1;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
 87     f[1]=1;
 88     for(int i=2;i<maxn-1;i++) f[i]=((f[i-1]*(4*i-2))%mod*inv[i+1])%mod;
 89 }
 90 int main()
 91 {    
 92     init();
 93     int t,n,k=0;
 94     scanf("%d",&t);
 95     while(t--)
 96     {
 97         scanf("%d",&n);
 98         printf("Case #%d:\n%lld\n",++k,f[n]);
 99     }
100     return 0;
101 }
View Code