這是我的一個不相交集的Objective-C實現。 - 正數指向父。 - 負數表示根子&兒童數。 (所以它們每個都在-1處開始脫節。) - 索引用作我正在分組的數據。 似乎工作正常...只是有幾個問題。在不相交的集合數據結構中實現路徑壓縮?
找到:如何壓縮路徑?因爲我沒有遞歸執行它,所以我必須存儲路徑,並在查找根後再次循環設置它?
加入:我基於加入兒童數而不是深度!?我想這是不對的。如果深度相等,我需要在連接過程中做些特別的事情嗎?
謝謝。
DisjointSet.h
@interface DisjointSet : NSObject
{
NSMutableArray *_array;
}
- (id)initWithSize:(NSInteger)size;
- (NSInteger)find:(NSInteger)item;
- (void)join:(NSInteger)root1 root2:(NSInteger)root2;
@end
DisjointSet.m
#import "DisjointSet.h"
@implementation DisjointSet
- (id)initWithSize:(NSInteger)size
{
self = [super init];
if (self)
{
_array = [NSMutableArray arrayWithCapacity:size];
for (NSInteger i = 0; i < size; i++)
{
[_array addObject:[NSNumber numberWithInteger:-1]];
}
}
return self;
}
- (NSInteger)find:(NSInteger)item
{
while ([[_array objectAtIndex:item] integerValue] >= 0)
{
item = [[_array objectAtIndex:item] integerValue];
}
return item;
}
- (void)join:(NSInteger)root1 root2:(NSInteger)root2
{
if (root1 == root2) return;
NSInteger data1 = [[_array objectAtIndex:root1] integerValue];
NSInteger data2 = [[_array objectAtIndex:root2] integerValue];
if (data2 < data1)
{
[_array setObject:[NSNumber numberWithInteger:data2 + data1] atIndexedSubscript:root2];
[_array setObject:[NSNumber numberWithInteger:root2] atIndexedSubscript:root1];
}
else
{
[_array setObject:[NSNumber numberWithInteger:data1 + data2] atIndexedSubscript:root1];
[_array setObject:[NSNumber numberWithInteger:root1] atIndexedSubscript:root2];
}
}
@end
「NSInteger bRank = - [_ array [a] integerValue];」 應該是「[b]」? 謝謝 –
和我想它(joinItem,否則)將「aRank - 1」如果存儲排名作爲一個負面的根... ...?無論如何,再次感謝 –
是的。我糾正了你指出的錯誤。 –