在幾種編程語言中,有Set集合,它們應該是有限集合的數學概念的實現。爲什麼許多編程語言中的集合不是真的集合?
然而,這未必是真實的,例如在C#
和Java
的HashSet<T>
兩種實現允許您添加任何HashSet<T>
集合作爲自身的一個成員。不允許使用數學集的現代定義。
背景:
根據樸素集合論,一組的定義是:
一組是不同的對象的集合。
然而,這個定義導致着名的Russel's Paradox以及其他悖論。爲了方便起見,羅素的悖論是:
讓R是所有不屬於自己成員的集合。如果R 不是其自身的成員,則其定義指示它必須包含自身,並且如果它包含自身,則它與它自己的定義相矛盾,作爲不是其自身成員的所有集合的集合。
所以根據現代集理論(參見:ZFC),一組的定義是:
一組是不同的對象,其中沒有一個是集 本身的集合。
具體而言,這是axiom of regularity的結果。
那又如何?這有什麼影響?爲什麼這個問題在StackOverflow上?
羅素的矛盾之一是並非所有的集合都是集合。此外,這是數學家放棄定義作爲通常的英語定義的地步。所以我認爲這個問題在編程語言設計中有很大的影響力。
問題(S):
那麼,爲什麼編程語言,誰在某種形式,用這些原則在他們的設計非常只是忽略它設置在他們的語言庫的實現?其次,這是數學概念的其他實現常見的情況嗎?
也許我有點挑剔,但如果這些都是集合的真正實現,那麼爲什麼會忽略這個定義的一部分?
更新
的C#和Java代碼片斷示範行爲增加:
Java代碼:
Set<Object> hashSet = new HashSet<Object>();
hashSet.add(1);
hashSet.add("Tiger");
hashSet.add(hashSet);
hashSet.add('f');
Object[] array = hashSet.toArray();
HashSet<Object> hash = (HashSet<Object>)array[3];
System.out.println("HashSet in HashSet:");
for (Object obj : hash)
System.out.println(obj);
System.out.println("\nPrinciple HashSet:");
for (Object obj : hashSet)
System.out.println(obj);
打印出:
HashSet in HashSet:
f
1
Tiger
[f, 1, Tiger, (this Collection)]
Principle HashSet:
f
1
Tiger
[f, 1, Tiger, (this Collection)]
C#代碼片段:
HashSet<object> hashSet = new HashSet<object>();
hashSet.Add(1);
hashSet.Add("Tiger");
hashSet.Add(hashSet);
hashSet.Add('f');
object[] array = hashSet.ToArray();
var hash = (HashSet<object>)array[2];
Console.WriteLine("HashSet in HashSet:");
foreach (object obj in hash)
Console.WriteLine(obj);
Console.WriteLine("\nPrinciple HashSet:");
foreach (object obj in hashSet)
Console.WriteLine(obj);
打印出:
HashSet in HashSet:
1
Tiger
System.Collections.Generic.HashSet`1[System.Object]
f
Principle HashSet:
1
Tiger
System.Collections.Generic.HashSet`1[System.Object]
f
更新2
在問候的Martijn Courteaux的第二點是它可以用計算效率的名義完成:
我在C#中做了兩個測試集合。它們是相同的,除了其中一個的Add方法 - 我添加了以下檢查:if (this != obj)
其中obj
是要添加到集合中的項目。
我主頻他們兩人分別在那裏他們增加的100,000個隨機整數:
通過Check:〜28毫秒
沒有檢查:〜21毫秒
這是一個性能跳躍相當顯着。
您可能會驚訝地發現,計算機的數字概念並不包括康托爾的無限性。計算機是有限的;數學不是。 – stark
「集合是不同對象的集合,它們都不是集合本身。」如果你的集合是S = HashSet,你不能將它添加到HashSet中,因爲它的類型不是T.定義並不是說集合中的元素不能是集合,它只是說一個設置不能包含它自己。 –
Save
@Save A'Set