第 60 講:自噬
不論是不是魚技巧,在之前的敘述里都有提到過一個詞匯:自噬(Cannibalism)。只要和這個術(shù)語詞沾邊的結(jié)構(gòu),都是可以刪除掉結(jié)構(gòu)本身的一部分的情況。
它的英文名Cannibalism的意思是“自相殘殺”,所以在術(shù)語詞里,我們把這個詞語翻譯為“自我吞噬”,簡稱“自噬”,暗示“吃掉”自己身上的某一個部分,而這個標(biāo)題里的英文單詞Cannibalistic是原詞語的形容詞。
在前文的敘述里,我們說過,自噬其實(shí)來自于魚結(jié)構(gòu)。那么下面就我們來看看,自噬到底是怎么回事。
Part 1 自噬魚的形成
讓我們來思考一種結(jié)構(gòu),既然定義域可以有重疊,那么,刪除域有重疊,會如何呢?


如左圖所示,這是一個之前介紹到的,全部區(qū)域類型都涉及了的交叉魚結(jié)構(gòu)。不過我們發(fā)現(xiàn),刪除域區(qū)域r3和c7實(shí)際上是擁有重疊的,只是圖上畫不出來,在r3c7,這個單元格確實(shí)屬于r3和c7的重疊位置,但是由于它在定義域上,所以我們無法為其圖上刪除域的顏色。不過,我們現(xiàn)在拓展一下魚結(jié)構(gòu),把它當(dāng)作這個魚的刪數(shù)結(jié)論。或者換句話說,這里的r3c7(x)實(shí)際上也是一個正確的刪數(shù),而且它甚至位于定義域上。不過,這得如何證明和說明它呢?
我們通過反證法來說明。假設(shè)我們讓r3c7 = x,會發(fā)生什么情況。首先是r3和c7這兩處刪除域區(qū)域,由于r3c7 = x的關(guān)系,r3c3和r7c7此時都不能放x了,于是c3和r7兩個區(qū)域能放入x的位置此時擠入b7這一個宮里。顯然,這樣是放不下的,因?yàn)橹挥幸粋€宮,而這個宮卻要放下兩處x,這是肯定不夠放的。所以,原來的假設(shè)是錯誤的,也就是說,即使r3c7含有候選數(shù)x,我們也必須刪掉它,否則結(jié)構(gòu)就不能正常放下應(yīng)該擁有的三個x。
我們稱r3c7(x)這一處候選數(shù),本身存在于定義域里,但由于填入后必然會出現(xiàn)矛盾導(dǎo)致結(jié)構(gòu)出錯的這一類候選數(shù)叫做自噬刪數(shù)(Cannibalistic Elimination);而我們把帶有自噬刪數(shù)的魚稱為自噬魚(Cannibalistic Fish)。
在早期的文獻(xiàn)里,自噬刪數(shù)也被稱為魚鰭,即稱自噬魚鰭(簡稱自噬鰭,Cannibalistic Fin)。算作魚鰭的原因很簡單,它確實(shí)影響了結(jié)構(gòu)的成立,因?yàn)樗紦?jù)了定義域的一處候選數(shù)位置。不過這種影響并不大,因?yàn)樗奶钊刖捅厝粚?dǎo)致了矛盾的出現(xiàn),所以此時就已經(jīng)應(yīng)當(dāng)把它刪除掉了。所以它的影響不足以大到像是內(nèi)魚鰭和外魚鰭一般。所以本文檔此時不將其算作魚鰭類別。
另外,自噬刪數(shù)我們在魚圖里使用“*x”表示,x暗示結(jié)構(gòu)在定義域區(qū)域上,表示這個單元格含有這個候選數(shù);而“*”實(shí)際上表示的是魚圖的刪數(shù)。在前面所有魚圖里,我們都沒有用“*”表示刪數(shù),是因?yàn)槲覀兛梢酝ㄟ^涂色來說明刪數(shù)位置,就沒有在每一個單元格都寫上該符號。而且,書寫這個符號過多,就會導(dǎo)致它會和“x”符號混淆不清。
Part 2 原理進(jìn)一步剖析
從上一個魚圖示例里看到,似乎最開始我們給出“刪除域區(qū)域交集”的信息點(diǎn)跟刪數(shù)實(shí)際上的關(guān)系并不大。所以這僅僅是巧合?實(shí)際上并不是。我們再舉一個例子來說明這一點(diǎn)。

如圖所示,這個結(jié)構(gòu)的定義域?yàn)閏237,刪除域則為r36b4。顯然,如果我們忽視r6c23(x)的話,它滿足了全覆蓋要求,而且區(qū)域數(shù)也一樣,所以刪數(shù)是肯定成立的。
不過,r6c23(x)的存在,會使得結(jié)構(gòu)怎么樣呢?假設(shè)我們讓r6c2 = x,顯然它占據(jù)了兩處刪除域區(qū)域r6和b4,以及一處定義域區(qū)域c2。那么,我們還需要放置的x的位置全部被擠入到唯一的一處刪除域區(qū)域r3里了,此時結(jié)構(gòu)出現(xiàn)錯誤,所以r6c2 <> x;同樣地,如果你假設(shè)r6c3 = x,照樣會這樣出錯。
對比上一個魚圖示例,和這里的示例,可以看到,它們的刪數(shù)的推導(dǎo)過程大致相同的地方在于,最后都會使得后續(xù)要放的x被擠入到同一個刪除域區(qū)域里。比如第一個魚圖示例里,可能的x被擠入到b7這個刪除域區(qū)域之中;而這個示例里,可能的x被擠入到r3這個刪除域區(qū)域之中。這難免也太巧合了吧,為什么會發(fā)生這種現(xiàn)象?
原因是這樣的。當(dāng)我們一旦在刪除域區(qū)域的交集上放x后,如果這個數(shù)在定義域某處上,這個時候它會同時影響到一個定義域區(qū)域和兩個刪除域區(qū)域,這是毋庸置疑的,因?yàn)樗幱趧h除域區(qū)域的交集上,顯然影響了兩處刪除域區(qū)域,而它也在定義域區(qū)域上,自然也會影響到一個定義域區(qū)域。這樣一來,它就會使得原本n個定義域區(qū)域和n個刪除域區(qū)域恰好成立的結(jié)構(gòu)立馬變?yōu)橹挥?n - 1)個定義域區(qū)域和(n - 2)個刪除域區(qū)域。
接下來的內(nèi)容會比較繞,希望你能一句一句地分析和理解。(n - 1)個定義域區(qū)域保證這個結(jié)構(gòu)還需要填入(n - 1)處x,而刪除域保證這些區(qū)域里最多只能放下(n - 2)處x,注意,此時是最多能放這么多個x。試想一下,由于原結(jié)構(gòu)是全覆蓋的,但現(xiàn)在只剩下最多可以放(n - 2)個x,但定義域又必須規(guī)定此時還必須填(n - 1)個,顯然(n - 1)是比(n - 2)要大的,這不是矛盾了嗎,最多能放的個數(shù)居然比必須規(guī)定要放的個數(shù)還要少,這怎么可能?所以矛盾了。
上述的兩則示例,在這個理論里,都表示n = 3時的情況,實(shí)際上,當(dāng)n = 4甚至更高,也都符合這個理論,因?yàn)轸~的定義域和刪除域的定義是這么規(guī)定的:定義域要求每一個區(qū)域都恰好填入一個x;而刪除域要求每一個區(qū)域都最多填入一個x,而我們僅通過這個定義就能得到這個結(jié)論,所以它本身就是帶有普遍和廣泛意義的,跟n數(shù)值多少是無關(guān)的。當(dāng)然了,這里的n肯定不能小于2,否則(n - 2)就變?yōu)榱艘粋€負(fù)數(shù),就沒有意義了。
所以,我們只需要掌握的是,只要原魚結(jié)構(gòu)是成立的(滿足區(qū)域數(shù)一樣多,以及全覆蓋的要求即可),那么刪除域一旦存在交集,那么交集處的元素就可以刪除,不論它在哪里。
這里就需要你注意一個地方了。如果刪除域區(qū)域的交集如果不處于定義域上,這顯然是可以刪的,因?yàn)楫吘顾趧h除域區(qū)域上,而且又不受定義域區(qū)域填數(shù)的限制和影響,本來就可以刪除,它這就是一個普通的、平凡的刪數(shù);而如果刪除域區(qū)域的交集在定義域上的話,那么就需要理論的依托才可以刪數(shù)。所以,實(shí)際上它們都是可以刪的。只是需要請你注意它們的區(qū)別,雖然都是可以刪除的,但刪數(shù)原因不同:一個是普通的刪數(shù),而一個是理論支持得到的矛盾而引起的刪數(shù)。
Part 3 自噬魚的示例
下面我們來看一些自噬魚的示例。
3-1?自噬三鏈列

如圖所示,這是一個帶有自噬刪數(shù)的交叉三鏈列結(jié)構(gòu)。首先我們來分析自噬刪數(shù)的刪數(shù)原因。由于它同時位于兩個刪除域區(qū)域和一個定義域區(qū)域上,如果貿(mào)然讓此處填入7,就會使得兩個刪除域區(qū)域r3和c5受到填數(shù)影響,一個定義域區(qū)域b2受到影響。顯然,整個結(jié)構(gòu)需要放置三處7(因?yàn)橛腥齻€定義域),但由于刪除域區(qū)域目前只有一個,而定義域區(qū)域區(qū)域卻有兩個,刪除域使得結(jié)構(gòu)最多只能讓結(jié)構(gòu)上再放1個7進(jìn)去,而定義域卻要求結(jié)構(gòu)必須放2個7,這顯然沖突了。所以r3c5 <> 7;另外,由于這個數(shù)已經(jīng)刪除后,剩余的部分就成了一個普通的交叉三鏈列結(jié)構(gòu),所以刪數(shù)全部都屬于正常的刪數(shù)情況,這里就不用闡述了。
3-2?自噬四鏈列
接下來來看一些帶有自噬刪數(shù)的四鏈列結(jié)構(gòu)。

如圖所示,我們嘗試把c2689作為定義域,而r259b3作為刪除域,顯然可以看到的是,r2c8位于r2和b3的交集處,而且它確實(shí)在定義域區(qū)域c8上。如果r2c8 = 8,則定義域區(qū)域變?yōu)槿齻€,而刪除域區(qū)域則變?yōu)閮蓚€。顯然,最多只能放2個8和恰好放入3個8的說法是互相矛盾的,所以矛盾。所以,r2c8 <> 3。其它的刪數(shù)就不用再次作出介紹了,因?yàn)槎际瞧胀ǖ膶m內(nèi)四鏈列的基本刪數(shù)。

如圖所示,這一則示例和上面的類型頁非常類似,而邏輯也是一樣的,就不必作出闡述了。希望你能夠獨(dú)立理解。
3-3?自噬五鏈列

這一個示例是我個人最喜歡的一個例子了,因?yàn)樗膭h數(shù)對于結(jié)構(gòu)的每一處都是可以刪掉的,非常整齊。
如圖所示,這個結(jié)構(gòu)的定義域?yàn)閏23569,刪除域則是r147b15??梢钥吹?,這樣看結(jié)構(gòu)的話,必然b1和r1會有重疊,而b5和r4會有重疊,而重疊的位置也都恰好位于定義域區(qū)域上。假設(shè)這些重疊的位置但凡有一處填入9,比如r1c2 = 9,則定義域區(qū)域少一個,刪除域區(qū)域數(shù)少兩個,產(chǎn)生矛盾;其它的候選數(shù)也都是如此。
3-4?帶魚鰭的自噬魚

最后來介紹一個帶有其它魚鰭和自噬刪數(shù)的魚結(jié)構(gòu)。
如圖所示,這個結(jié)構(gòu)的定義域?yàn)閞35b567,刪除域則是r6c2368??梢园l(fā)現(xiàn),定義域區(qū)域r5和b6產(chǎn)生了重疊,且重疊處存在候選數(shù),即r5c8(7)。我們不得不把它視為內(nèi)魚鰭來看。假設(shè)它不存在的話,那么帶有自噬刪數(shù)的魚結(jié)構(gòu)就成立了,注意,刪除域區(qū)域r6和c8是有重疊的,r6c8也確實(shí)恰好在定義域區(qū)域上,所以它被看作自噬刪數(shù)。
如果內(nèi)魚鰭r5c8(7)為假,則這個自噬刪數(shù)可以刪除,原因是會導(dǎo)致定義域區(qū)域少一個,刪除域區(qū)域少兩個的矛盾;而其它的刪除域區(qū)域上的刪數(shù)也都是可以正常刪除掉的。但是內(nèi)魚鰭的客觀存在,所以最終刪數(shù)就只能是內(nèi)魚鰭能夠?qū)?yīng)到的位置,即c8這個刪除域區(qū)域了。
可以看到,此時c8上包含了剛才的自噬刪數(shù)r6c8(7),那么此時它能否被刪除呢?答案自然是肯定的。因?yàn)樵隰~鰭為假的時候,我們通過了自噬的原理來刪掉了它;而當(dāng)魚鰭為真的時候,顯然它也作為同一區(qū)域的其它候選而存在,當(dāng)然也可以被刪掉。所以其實(shí)這里的r6c8(7)是可以被刪除的。