给定一个2d数组int[n,n]
,并且考虑到我们正在实现一些算法,需要记住任意数量的单元格(可能只有n
个,但平均要低得多,见下文):< / p>
在保持恒定时间查找的同时,以最有效的方式(最少的内存量)存储我们访问过单元的事实的最有效方法是什么?
让我补充一点:
最坏的情况是O(n)我们需要记住的细胞数量,然而平均情况要低得多。让我们说平均而言我们只需要记住少于O(logn)的细胞。
我有兴趣针对普通情况对此进行优化。
答案 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