我有一个大的2D网格,x-by-y.应用程序的用户将添加有关此网格上特定点的数据.遗憾的是,网格太大而无法实现为大型x-by-y阵列,因为运行它的系统没有足够的内存.
实现这一点的好方法是什么,只有添加了数据的点存储在内存中?
我的第一个想法是创建数据点的BST.诸如"(long)x << 32 + y"的散列函数将用于比较节点.
然后我得出结论,如果没有很好的平衡,这可能会失去效率,所以我想出了一个具有可比BST点数的BST的想法.外部BST将根据它们的x值比较内部BST.内部BST将比较点的y值(并且它们都具有相同的x).因此,当程序员想要查看(5,6)处是否存在点时,他们会查询外部BST为5.如果在该点存在内部BST,则程序员将查询内部BST为6.结果将被退回
你能想到更好的实现方法吗?
编辑:关于HashMaps:大多数HashMaps都需要有一个数组用于查找.有人会说"data [hash(Point)] = Point();" 设置一个点然后通过散列找到Point来查找索引.然而,问题是数组必须是散列函数范围的大小.如果此范围小于添加的数据点总数,则它们将没有空间或必须添加到溢出.因为我不知道将要添加的点数,所以我必须假设这个数字小于一定数量,然后将数组设置为该大小.同样,这实例化了一个非常大的数组(尽管假设数据点的数量比x*y少,但比原来要小).
看起来我想要的是SparseArray,正如一些人所提到的那样.它们的实施方式类似于在BST内部使用BST吗?
Edit2:Map <>是一个界面.如果我使用Map,那么看起来TreeMap <>将是最好的选择.所以我最终会得到TreeMap <TreeMap <Point >>,类似于人们所做的Map <Map <Point >>>建议,这基本上是BST内部的BST.感谢您的信息,因为我不知道TreeMap <>基本上是BST的Java SDK.
编辑3:对于那些可能关心的人,选择的答案是最好的方法.首先,必须创建一个包含(x,y)并实现可比较的Point类.Point可以通过类似(((long)x)<< 32)+ y)的方式进行比较.然后,TreeMap会指向数据.搜索这个是有效的,因为它在一个平衡的树中,因此log(n)成本.用户还可以使用TreeMap.entrySet()函数查询所有这些数据,或者遍历它,该函数返回一组Points以及数据.
总之,这允许稀疏阵列的空间效率和搜索效率的实现,或者在我的情况下,2D阵列,其也可以有效地迭代.
我有一个简单的移动应用程序。它首先提示用户选择一个图像,然后通过以下代码在本地加载并显示在画布上:
function handleFileSelect(evt) {
var files = evt.target.files;
var f = files[0];
console.log(evt);
var ctx = document.getElementById("myCanvas").getContext('2d'),
img = new Image(),
f = document.getElementById("uploadbutton").files[0],
url = window.URL || window.webkitURL,
src = url.createObjectURL(f);
img.src = src;
lastImage = img;
img.onload = function()
{
window.requestAnimationFrame(function(){
var w = window.innerWidth;
var h = window.innerHeight;
ctx.clearRect(0, 0, w, h);
ctx.drawImage(lastImage, 0, 0);
//url.revokeObjectURL(src);
});
}}
Run Code Online (Sandbox Code Playgroud)
在我的网络浏览器和手机上,图像已正确加载并显示在画布中,但是我从使用 Google Chrome 在 Razr Maxx HD 上运行它的用户那里听说,他们会收到“错误:无法加载由于内存不足,之前的操作。” 我怀疑这个问题不能通过首先读取图像然后在显示之前缩放它来解决,因为即使没有显示完整的图像也已经加载到内存中。有没有办法在不先加载整个图像的情况下将图像的缩放版本加载到内存中?知道是什么导致了这个问题,因为我能够在我的 Galaxy S3 上以 chrome 加载大量图像,并且 Galaxy S3 的 …
我听说某处有.9和1之间的数字多于0和.1之间的数字,当它们表示为离散有限位时(为了参数,我们假设32位浮点数).有人可以向我解释为什么会出现这种情况,并给出一个0和.1之间的数字的例子,这个数字不能被表示,但它的相应数字在.9和1之间(通过数学上加上.9)可以用浮动?
(这与rng相关,因为它们可能偏向不同的范围.)
正如标题所示,我需要制作比快速排序更快的算法.有问题的快速排序已经过优化,并在一个天真的并行系统中使用,因此单个线程完全执行每个快速排序,但多个线程同时进行快速排序.我需要制作一个比这个过程更快的算法.通过让额外的线程执行对枢轴每一侧的排序或者这个过程有太多的开销并最终导致减速,并行每个快速排序会更快吗?有关算法的任何建议吗?
我想以下列方式在 C 中运行一个 python 脚本:(我已经分叉了)
err = execlp("python", "my_script.py", "test", (char*) NULL);
Run Code Online (Sandbox Code Playgroud)
在bash中,我可以成功运行
python my_script.py test
Run Code Online (Sandbox Code Playgroud)
(测试是python脚本的参数)
但是,程序输出
my_script.py: can't open file 'test': [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?:3
c ×3
algorithm ×1
bash ×1
exec ×1
html ×1
html5-canvas ×1
java ×1
javascript ×1
math ×1
performance ×1
python ×1
sorting ×1