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);
}