在iOS中实现cantor配对功能

时间:2013-04-08 15:41:07

标签: ios math mapping square-root

我在Java中实现了 Cantor配对功能 2年前。现在,我正在向iOS移动,我需要在Objective-C中使用相同的东西。

问题是,至少从我的观点来看,在Java中我必须实现 BigSqrt 类 这是我自己做的。因为理论上我现在可以配对任何大小的数字。

因为我是iOS的新手,我真的不知道是否必须为objective-C再次实现所有的东西,或者是否已经实现了某些东西。如果是这样,有人可以给我一个提示,在 Objective-C 中为任何大小的“整数”开始实施 Cantor配对功能吗?

谢谢

2 个答案:

答案 0 :(得分:3)

我用它在tableview单元格上设置标签:

NSUInteger cantorPair(NSIndexPath *indexPath)
{
    NSUInteger x = indexPath.section;
    NSUInteger y = indexPath.row;
    return ((x + y) * (x + y + 1)) / 2 + y;
}


NSIndexPath *reverseCantorPair(NSUInteger z)
{
    NSUInteger t = floor((-1.0f + sqrt(1.0f + 8.0f * z))/2.0f);
    NSUInteger x = t * (t + 3) / 2 - z;
    NSUInteger y = z - t * (t + 1) / 2;
    return [NSIndexPath indexPathForRow:y inSection:x];
}

答案 1 :(得分:1)

这适用于C#版本,但在Objective-C中几乎相同:

http://sachiniscool.blogspot.com/2011/06/cantor-pairing-function-and-reversal.html

int CantorPair(short x, short y)
{
    return ((x + y) * (x + y + 1)) / 2 + y;
}

并扭转配对

short[] Reverse(int z)
{
    short[] pair = new short[2];
    int t = (int)Math.Floor((-1D + Math.Sqrt(1D + 8 * z))/2D);
    int x = t * (t + 3) / 2 - z;
    int y = z - t * (t + 1) / 2;
    pair[0] = (short)x;
    pair[1] = (short)y;
    return pair;
}