是否可以在 JavaScript 中创建一个 XOR 双向链表?
Is it possible to create an XOR doubly-linked list in JavaScript?
JavaScript 对象似乎与 ^ XOR 运算符不兼容。那么有什么方法可以创建异或双向链表吗?
我可以做常规的 single/double 链接列表。而且我搜索了 SO 和 Google 但没有成功,所以我猜这是不可能的。或者也许没有人真正关心 XOR 列表...
var node = function(data, xor){
this.data = data;
this.xor = xor;
}
var myNode=new node('data', 0);
console.log(0 ^ myNode); // shows 0, should show myNode
console.log(null ^ myNode); // shows 0, too
console.log(5 ^ 0); // 5 as expected
您无法在 JavaScript 中实现正确的 XOR 链表,因为您无法访问对象的内存地址。
在 JavaScript 中也没有实际的理由这样做。据我了解,异或链表的唯一好处是稍微减少了内存占用。在 JavaScript 中使用这种结构节省的内存量被对象本身的开销所抵消。
有人问过一次关于 Python 的相同问题; the answer 也适用于 JavaScript.
纯粹为了练习,写了一点用map来模拟指针。显然,这不适用于生产代码。
var node = function(data, xor){
this.data = data;
this.xor = xor;
}
var pointerFactory = function(){
var pointers = {};
var pointerCount = 0;
this.get_pointer = function(node){
if (pointers.hasOwnProperty(node)) return pointers[node];
pointerCount++;
pointers[node]=pointerCount;
pointers[pointerCount]=node;
return pointerCount;
}
this.dereference_pointer = function(pointer){
return (pointers.hasOwnProperty(pointer)) ? pointers[pointer] : null;
}
}
var myNode = new node('my data', 0);
var pf = new pointerFactory();
var p = pf.get_pointer(myNode);
console.log(pf.dereference_pointer(p).data); // my data
console.log(pf.dereference_pointer(2)); //null
console.log(0 ^ p); // 1
console.log(p ^ p); // 0
JavaScript 对象似乎与 ^ XOR 运算符不兼容。那么有什么方法可以创建异或双向链表吗?
我可以做常规的 single/double 链接列表。而且我搜索了 SO 和 Google 但没有成功,所以我猜这是不可能的。或者也许没有人真正关心 XOR 列表...
var node = function(data, xor){
this.data = data;
this.xor = xor;
}
var myNode=new node('data', 0);
console.log(0 ^ myNode); // shows 0, should show myNode
console.log(null ^ myNode); // shows 0, too
console.log(5 ^ 0); // 5 as expected
您无法在 JavaScript 中实现正确的 XOR 链表,因为您无法访问对象的内存地址。
在 JavaScript 中也没有实际的理由这样做。据我了解,异或链表的唯一好处是稍微减少了内存占用。在 JavaScript 中使用这种结构节省的内存量被对象本身的开销所抵消。
有人问过一次关于 Python 的相同问题; the answer 也适用于 JavaScript.
纯粹为了练习,写了一点用map来模拟指针。显然,这不适用于生产代码。
var node = function(data, xor){
this.data = data;
this.xor = xor;
}
var pointerFactory = function(){
var pointers = {};
var pointerCount = 0;
this.get_pointer = function(node){
if (pointers.hasOwnProperty(node)) return pointers[node];
pointerCount++;
pointers[node]=pointerCount;
pointers[pointerCount]=node;
return pointerCount;
}
this.dereference_pointer = function(pointer){
return (pointers.hasOwnProperty(pointer)) ? pointers[pointer] : null;
}
}
var myNode = new node('my data', 0);
var pf = new pointerFactory();
var p = pf.get_pointer(myNode);
console.log(pf.dereference_pointer(p).data); // my data
console.log(pf.dereference_pointer(2)); //null
console.log(0 ^ p); // 1
console.log(p ^ p); // 0