我有一个〜2000对象的数组,就像这种格式:
Canvas
我需要以有效方式将对象插入正确的位置: e.g:
from tkinter import *
root = Tk()
... #Just creating widgets
def openDrawing:
...#What goes in here ?
fileMenu.add_command(label = "Open Drawing",command=openDrawing,accelerator="Ctrl+O")
root.mainloop()
假设我在插入新元素时不需要覆盖现有元素(没有重复" $ order"),任何人都知道将新对象插入数组的好的快速算法使用$ order作为关键? 外部库也是一种选择(如果它们支持Angular)。 谢谢!
答案 0 :(得分:2)
看起来你不能低于接头实现的复杂性,这取决于引擎。
您可以优化的是搜索算法。我会去二元搜索。
有关二元搜索的更多信息,请参阅http://www.tutorialspoint.com/data_structures_algorithms/binary_search_algorithm.htm
答案 1 :(得分:2)
至少你需要迭代直到找到索引。
var array = [{ "$order": 2998, "text": "Rosales Glenn", "id": 375 }, { "$order": 2999, "text": "Dillard Joyce", "id": 450 }, { "$order": 3000, "text": "Maryellen Hogan", "id": 365 }, { "$order": 3002, "text": "Jeannette Church", "id": 207 }],
insert = { "$order": 3001, "text": "Jeannette Chichi", "id": 205 },
index = -1;
array.some(function (a,i) {
if (a.$order > insert.$order) {
return true;
}
index = i;
});
array.splice(index + 1, 0, insert);
console.log(array);
或者按照建议,您可以使用二进制搜索。
function search(array, insert, cb) {
var left = -1,
right = array.length,
actual;
while (left !== right && left + 1 !== right) {
actual = Math.floor((left + right) / 2);
if (cb(array[actual]) < cb(insert)) {
left = actual;
continue;
}
if (cb(array[actual]) > cb(insert)) {
right = actual;
}
}
return left;
}
var array = [{ "$order": 2998, "text": "Rosales Glenn", "id": 375 }, { "$order": 2999, "text": "Dillard Joyce", "id": 450 }, { "$order": 3000, "text": "Maryellen Hogan", "id": 365 }, { "$order": 3002, "text": "Jeannette Church", "id": 207 }],
insert = { "$order": 3001, "text": "Jeannette Chichi", "id": 205 },
index = search(array, insert, function (a) { return a.$order; });
array.splice(index + 1, 0, insert);
console.log(array);