簡體   English   中英

在Javascript Hashmap中使用坐標作為鍵的最快方法

[英]Fastest Way of Using Coordinates as Keys in Javascript Hashmap

我想使用對象的坐標來存儲對象,如下所示:

var hash_map = {};
hash_map[x + "-" + y] = new Object();

然后可以使用hash_map[x + "-" + y]檢索它們。

但是,我不確定每次訪問對象時是否創建一個新字符串是否是一個好主意。

一種替代方法是通過執行x | (y >>> 16)來組合坐標x | (y >>> 16) x | (y >>> 16)但是我不知道將y值移動多少位,內部實際發生了什么(因為javascript的數字都是浮點數,所以有指數和尾數等)以及它是否真正值得。

tl; dr在以坐標為鍵的哈希圖中存儲對象的最快方法(包括垃圾回收)是什么?

您可以使用以下解決方案將一對坐標組合為單個32位帶符號整數。 然后可以將此整數用作JS對象的鍵。 2個坐標最多只能為16位。 因此,x和y只能包含-32767到+32767(2 ^ 15-1)的值。

在下面的示例中,將生成100個隨機坐標對,並將它們的值包含從鍵計算的x和y坐標添加到hash_map對象。 坐標必須在上述范圍內,否則將引發異常。

 var MAX_16BIT_SIGNED = 32767; //Math.floor((Math.pow(2, 16)/2)-1); function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } function getRandomKey() { var x = getRandomIntInclusive(MAX_16BIT_SIGNED * -1, MAX_16BIT_SIGNED), y = getRandomIntInclusive(MAX_16BIT_SIGNED * -1, MAX_16BIT_SIGNED); //console.log("Generated key with x: " + x + " and y: " + y); return getKey(x, y); } function getKey(x, y) { if (x > MAX_16BIT_SIGNED || y > MAX_16BIT_SIGNED) throw "Invalid X or Y value."; x += MAX_16BIT_SIGNED; y += MAX_16BIT_SIGNED; return (x << 16) | y; } function getX(key) { return (key >> 16) - MAX_16BIT_SIGNED; } function getY(key) { return (key & 0xFFFF) - MAX_16BIT_SIGNED; } var hash_map = {}; hash_map[getKey(MAX_16BIT_SIGNED * -1, MAX_16BIT_SIGNED)] = "test"; hash_map[getKey(MAX_16BIT_SIGNED, MAX_16BIT_SIGNED)] = "test"; hash_map[getKey(MAX_16BIT_SIGNED * -1, MAX_16BIT_SIGNED * -1)] = "test"; hash_map[getKey(MAX_16BIT_SIGNED, MAX_16BIT_SIGNED * -1)] = "test"; //hash_map[getKey(MAX_16BIT_SIGNED+1, MAX_16BIT_SIGNED+1)] = "test"; for (var i = 0; i < 100; i++) { var key = getRandomKey(); hash_map[key] = { x: getX(key), y: getY(key) }; } console.log(JSON.stringify(hash_map)); console.log(100 === Object.keys(hash_map).length); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM