很久以前,我以1.25美元的价格从交易台上买了一本数据结构书.在其中,哈希函数的解释说,由于"数学的本质",它最终应该由质数修改.
你对1.25美元的书有什么期望?
无论如何,我有多年的时间来思考数学的本质,但仍然无法弄明白.
当存在大量的桶时,数字的分布是否真的更均匀?或者这是一个老程序员的故事,每个人都接受,因为其他人都接受它?
我使用a Dictionary<Int,Int>来存储图像中颜色的频率,其中键是颜色(作为int),值是在图像中找到颜色的次数.
当我处理更大/更彩色的图像时,这个字典会变得非常大.我在大约6,000,000个条目中得到了一个内存不足的例外.这是在32位模式下运行时的预期容量吗?如果是这样,我能做些什么吗?什么可能是一些跟踪这些不会耗尽内存的数据的替代方法?
作为参考,这里的代码循环通过位图中的像素并将频率保存在Dictionary<int,int>:
Bitmap b; // = something...
Dictionary<int, int> count = new Dictionary<int, int>();
System.Drawing.Color color;
for (int i = 0; i < b.Width; i++)
{
for (int j = 0; j < b.Height; j++)
{
color = b.GetPixel(i, j);
int colorString = color.ToArgb();
if (!count.Keys.Contains(color.ToArgb()))
{
count.Add(colorString, 0);
}
count[colorString] = count[colorString] + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果您想知道哪个图像中有多种不同的颜色:http://allrgb.com/images/mandelbrot.png
编辑:我还应该提一下,这是在使用.Net 4.0的asp.net Web应用程序中运行的.因此可能存在额外的内存限制.
编辑:我只是在控制台应用程序中运行相同的代码,没有任何问题.问题只发生在ASP.Net中.
我想知道是否有任何好的参考(网站甚至更好,一本书),我可以找到有关常用集合的内部实现的信息,如
Dictionary<TKey, TValue>List<T>Queue<T>Stack<T>通过内部实现,我的意思是他们如何使用动态数组来存储数据,他们调整大小的频率,常见操作的时间和空间复杂度.
当然,如果有人认为他可以在这个帖子中提供这些信息,那么非常欢迎你!
阅读此问题的优秀答案后:
我决定将初始容量设置为一个很大的猜测,然后在读取所有值后进行调整。我怎样才能做到这一点?也就是说,如何修剪字典,以便gc稍后收集未使用的空间?
我的目标是优化。我经常有大型数据集,小型数据集的时间损失是可以接受的。我想避免在大型数据集上重新分配和复制初始容量较小的数据所产生的开销。