使用最大API进行双端队列?

时间:2019-02-09 19:27:29

标签: data-structures

使用max() API来实现队列,以使push()pop()max()都在(摊销)O(1)中工作是{{3} }。是否存在一种已知的解决方案,该解决方案使用比O(n)更快的相同max() API实现双头队列?可以证明这是不可能的吗?

1 个答案:

答案 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 } } 并返回较大的值