使用max()
API来实现队列,以使push()
,pop()
和max()
都在(摊销)O(1)中工作是{{3} }。是否存在一种已知的解决方案,该解决方案使用比O(n)更快的相同max()
API实现双头队列?可以证明这是不可能的吗?
答案 0 :(得分:2)
拥有O(1)
最大api的deque
是100%的可能性。
一个deque
可以是implemented from two stacks。尽管还有一些其他的业务逻辑可以使get_max()
保持平衡,但是这个想法非常简单。想象一下,两个面向相反方向的堆栈连接在一起。从此结构中,您可以弹出并附加到两侧。
可以创建具有恒定时间get_min()
或(value, current_max)
的堆栈。每次推入堆栈时,都会推入两件事-current_max
。通过将上一个元素中的current_max
与当前value
进行比较,可以在恒定时间内计算get_max()
。 current_max
的结果将始终是堆栈顶部的deque
。
如果您从具有get_max()
api的两个堆栈中实现get_max()
,要获得最大双端队列,则只需为两个堆栈调用const hdkey = require('ethereumjs-wallet/hdkey');
const Transaction = require('ethereumjs-tx');
const walletHdpath = "m/44'/60'/0'/0/";
const hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(process.env.KEYSTORE_SEED));
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
async function generateAccount() {
const wallet = hdwallet.derivePath(walletHdpath + nextAccountIndex).getWallet();
nextAccountIndex += 1;
const addr = '0x' + wallet.getAddress().toString('hex');
accounts[addr] = wallet;
await fundAccount(addr);
return addr;
}
async function fundAccount(address) {
const txParams = {
gasPrice: '20000000000',
gasLimit: '21000',
from: process.env.KEYSTORE_ADDRESS_0,
to: address,
value: web3.utils.toWei('0.1', 'ether'),
data: ''
}
const signed = signTransaction(txParams);
// this line throws exception: "exceeds block gas limit"
await web3.eth.sendSignedTransaction(signed.signed_transaction);
}
function signTransaction(txParams) {
const from = txParams.from.toLowerCase();
const wallet = accounts[from];
if (wallet === undefined) {
return {sucess: false, message: "unknown from account" }
}
const tx = new Transaction(txParams);
const pkey = wallet.getPrivateKey();
tx.sign(pkey);
const rawTx = '0x' + tx.serialize().toString('hex');
return { success: true, signed_transaction: rawTx }
}
并返回较大的值