记住2d矩阵中访问过的单元格的大多数内存有效方法?

时间:2017-12-13 00:54:02

标签: c# .net time-complexity space-complexity

给定一个2d数组int[n,n],并且考虑到我们正在实现一些算法,需要记住任意数量的单元格(可能只有n个,但平均要低得多,见下文):< / p>

在保持恒定时间查找的同时,以最有效的方式(最少的内存量)存储我们访问过单元的事实的最有效方法是什么?

让我补充一点:

最坏的情况是O(n)我们需要记住的细胞数量,然而平均情况要低得多。让我们说平均而言我们只需要记住少于O(logn)的细胞。

我有兴趣针对普通情况对此进行优化。

1 个答案:

答案 0 :(得分:1)

您可以使用int的MSB将其用作是否访问过该单元格的标志。如果你不需要低于-2 30 = -1,073,741,824或高于2 30 -1 = 1,073,741,823的整数,那么这将是要走的路:

public struct TaggableInteger 
{
    private uint _value;

    public bool IsTagged
    {
        get
        {
            return ((this._value >> 31) & 0x1) == 0x1;
        }

        set
        {
            this._value |= value ? (uint)0x1 << 31 : 0;
            this._value &= value ? this._value : (uint)0x7FFFFFFF;
        }
    }

    public int Value 
    { 
        get
        {
            return (int)(this._value << 1) >> 1;
        }

        set 
        {
            this._value = ((uint)value << 1) >> 1;
        }
    }

    public TaggableInteger(int valueInt) 
    {
        uint value = (uint) valueInt;
        this._value = (value << 1) >> 1;
    }
}

测试程序:

public static void Main()
{
    var i = new TaggableInteger(1047483640);
    Console.WriteLine("{0} {1}", i.IsTagged, i.Value);
    i.IsTagged = true;
    Console.WriteLine("{0} {1}", i.IsTagged, i.Value);
    i.IsTagged = false;
    Console.WriteLine("{0} {1}", i.IsTagged, i.Value);
}

打印

False 1047483640
True 1047483640
False 1047483640