Blockchain 查找Solidity/Ethereum高分的算法
在最小化天然气成本(或任何其他相关基准)方面,在稳健性方面,排序一系列值并找到最高分数的最佳方法是什么?如果重要的话,这些数字都在一个相当小的范围内我不知道是否有最好的方法,但我通常会在数组中添加新元素时跟踪最高的数字Blockchain 查找Solidity/Ethereum高分的算法,blockchain,ethereum,solidity,Blockchain,Ethereum,Solidity,在最小化天然气成本(或任何其他相关基准)方面,在稳健性方面,排序一系列值并找到最高分数的最佳方法是什么?如果重要的话,这些数字都在一个相当小的范围内我不知道是否有最好的方法,但我通常会在数组中添加新元素时跟踪最高的数字 function refreshTopXOrdered(uint value) private { uint i = 0; /** get the index of the current max element **/ for(i; i < top
function refreshTopXOrdered(uint value) private {
uint i = 0;
/** get the index of the current max element **/
for(i; i < topElementsOrdered.length; i++) {
if(topElementsOrdered[i] < value) {
break;
}
}
/** shift the array of one position (getting rid of the last element) **/
for(uint j = topElementsOrdered.length - 1; j > i; j--) {
topElementsOrdered[j] = topElementsOrdered[j - 1];
}
/** update the new max element **/
topElementsOrdered[i] = value;
}
这将在添加元素时跟踪更改,并保持顶部元素的顺序(降序)
如果这样称呼它呢
uint[] elements;
function add(uint value) public {
elements.push(value);
refreshTopXOrdered(value);
}
如果你想保住前几名的分数,米尔格的方法是最好的选择。显然,如果需要对所有元素进行排序,那么这种方法将不是最有效的方法,尤其是当数组变长时 通常,您应该避免在区块链上排序。这将非常昂贵,而且随着阵列的大小变大,您可能会遇到气体不足的异常情况。如果必须在链上排序,可能需要使用
uint[] elements;
function add(uint value) public {
elements.push(value);
refreshTopXOrdered(value);
}