(JavaScript)创建一个比我拥有的算法更高效的算法
我有这样的情况:(JavaScript)创建一个比我拥有的算法更高效的算法,javascript,algorithm,processing-efficiency,Javascript,Algorithm,Processing Efficiency,我有这样的情况: let scans = [ { source: "10.0.0.2", destination: "20.0.0.2" } { source: "10.0.0.4", destination: "20.0.0.6" } ] const handleScan = (source, destination, port) => { let newScan = { source : source,
let scans = [
{ source: "10.0.0.2", destination: "20.0.0.2" }
{ source: "10.0.0.4", destination: "20.0.0.6" }
]
const handleScan = (source, destination, port) => {
let newScan = {
source : source,
destination : destination
}
for (scan of scans) {
if (scan.source !== source && scan.destination !== destination)
scans.push(newScan)
}
}
现在,这个函数每秒执行1000次,这意味着每次执行for循环来查看这对函数是否存在是非常糟糕的。
您建议我如何更有效地完成这项工作?目标是跟踪所有来源的所有目的地吗?如果是这样的话,这不是它目前正在做的事情。以下是如何做到这一点:
let scans = [
{ source: "10.0.0.2", destination: "20.0.0.2" }
{ source: "10.0.0.4", destination: "20.0.0.6" }
]
const handleScan = (source, destination, port) => {
let newScan = {
source : source,
destination : destination
}
var scanFound = false;
for (scan of scans) {
if (scan.source !== source && scan.destination !== destination){
scanFound = true;
break;
}
}
if(!scanFound){
scans.push(newScan)
}
}
如果这就是目标,我建议将格式更改为一个对象,以source作为键,destinations作为值,因此它是一个查找,而不是一个循环:
var destinationsBySource = {
"10.0.0.2": ["20.0.0.2"],
"10.0.0.4": ["20.0.0.6"]
]
var handleScan = function(source, destination){
//Initialize destinations as an array if source is not there
destinationsBySource[source] = destinationsBySource[source] || [];
//Add the destination if needed
if(destinationsBySource[source].indexOf(destination) == -1){
destinationsBySource[source].push(destination);
}
};//End of handleScan function
如果您的代码没有任何问题,并且它实际上正在工作,但您只想检查它,并可能进行改进,我想你可以找到一个更好的答案,询问你是否真的想只推送源和目标与任何现有扫描不同的扫描?你可以创建一个
集
,它是由
分隔的源和目标的组合,将大量的新闻扫描
拷贝推送到你的阵列上,这可能是性能问题的根源。如果调用handleScan
一次,将以前未看到的IP作为源和目标,则可以通过调用scans.push(newScan)
为扫描中的每个元素执行一次扫描,从而使扫描的大小加倍。如果你用新的IP每秒调用1000次,扫描将很快占用比整个世界更多的内存,就像@Paulpro说的,你当前的算法似乎工作不正常。函数应该解决的问题是什么?这个扫描
阵列在其他地方是如何使用的?非常感谢。这是我记得在这种情况下应该采用的解决方案,但不能完全做到。@YossiDagan欢迎,很高兴我能提供帮助:)