Javascript 高效的[JS?]算法,用于列出和更新多个地点的买入/卖出价格
不,这不是为了面试问题,也不是为了密码Javascript 高效的[JS?]算法,用于列出和更新多个地点的买入/卖出价格,javascript,vue.js,vuetify.js,Javascript,Vue.js,Vuetify.js,不,这不是为了面试问题,也不是为了密码 它是一款个人非营利网络应用程序,用于补充游戏 这个问题部分是财务,部分是代码。 我正在用Vue编写这个web应用程序,所以我更喜欢JavaScript解决方案,但抽象方法很好,伪代码就很好了,我应该能够将任何impl翻译成JavaScript 场景如下: 多个地点(例如:“商店”)以不同的价格买卖多种商品。 价格随机变化(假定是由于供应/需求,但这与此无关)。 将有100-1000个位置和10-100个项目。 大多数地点(估计80-90%)只会购买/出售少
它是一款个人非营利网络应用程序,用于补充游戏 这个问题部分是财务,部分是代码。
我正在用Vue编写这个web应用程序,所以我更喜欢JavaScript解决方案,但抽象方法很好,伪代码就很好了,我应该能够将任何impl翻译成JavaScript 场景如下:
多个地点(例如:“商店”)以不同的价格买卖多种商品。
价格随机变化(假定是由于供应/需求,但这与此无关)。
将有100-1000个位置和10-100个项目。
大多数地点(估计80-90%)只会购买/出售少数物品。
一些地点(估计1-10%)将买卖许多或所有物品。
一些地点(估计50%)可能只买不卖,或者只卖不买 我想向所有具有该商品售价的地点(类似于排列/组合,但有许多预期差距)显示一份包含所有具有该商品买入价的地点的详尽列表。
最终渲染的数据必须只是一个简单的对象列表/数组(键控/值化) 9900万个对象(1000个商店*(1000-1个商店*100个项目)的分页列表将是最坏的情况,但预计数据中会有很多缺口,因此希望的对象少于100万个(我希望不超过100000个;这些不一定都是活在内存中的;我可以选择从存储中加载它们) 示例(按项目和购买地点排序,以便更好地查看示例数据集):
物品购买地点购买价格比率出售价格出售地点
项目A位置A 4 0.5 2位置B
项目A位置A 4 2.0 8位置C
项目A位置B 6 0.66 4位置A
项目A位置B 6 1.33 8位置C
项目A位置C10.4位置A
项目A位置C10.2位置B
B项位置A 3 0.33 1位置B
项目B位置A 3 1.33 4位置C
B项位置B 3 0.66 2位置A
项目B位置B 3 1.33 4位置C
项目B位置C 5 0.4 2位置A
项目B位置C 5 0.2 1位置B
列表中的每一列都是可排序的;默认排序将是“比率”,它将显示购买地点和销售地点的最佳组合。
更新任何价格后,Vue将自动更新列表并重新排序
现在,我有了自己的想法,但效率非常低,因为我的解决方案是在任何单一价格发生变化时重新生成整个列表。由于最终输出需要是一个可以任意排序的列表,因此没有真正的方法来索引或直接访问项目。
如果位置C的项目A购买价格发生变化,则无法说“更新X行Y列”,甚至只能说“更新X行” 但是,我怀疑我遗漏了什么。
我认为这是一项相当常见的任务,以前已经以这种规模实施过。
示例:跨多个交易所的“简单”买入/卖出价格表。
我曾考虑过看开放加密[机器人]代码,但这似乎更像是我想要理解的“金融”问题,而不是我想要复制的编码问题 您将如何实现这一点?
您将使用哪种类型的数据集 谢谢!在我看来
- 1万行数据太多,用户无法一次读取
- 1M的数组大小对于javascript来说不是很大(可以在应用程序中检查大约10MB),但是将所有数组都呈现给DOM元素可能是一个非常大的问题
computed: {
displayItems () {
// This will update when one of rawItems, currentPage, pageSize updated
return doFilterOrSort(rawItems).slice(currentPage * pageSize, pageSize)
}
}
这将解决过多DOM元素的问题(如上所述,我假设更新1M数组大小足够快,不会成为瓶颈)
如果您的数据在一秒钟内频繁更改10次,您可以通过节流或去抖动来减少渲染时间,从而改善这种情况
节流示例:
watch: {
rawItems () {
if (!ticking) {
requestAnimationFrame(() => {
displayItems = doFilterOrSort(rawItems).slice(currentPage * pageSize, pageSize)
ticking = false
})
ticking = true
}
}
}
若你们想拥有无限滚动的行为,你们可以通过回收屏幕外的DOM元素来实现。参见中的示例
您将使用哪种类型的数据集
您没有告诉您检索到的数据的格式(在初始和每次更新中;按存储?按项目?),因此很难回答
我假设商店和商品的数量是固定的(不经常更新),每次更新都是针对商店中的一个商品。用n和m表示商店和商品的数量
我将使用3个阵列:
第一个数组,用于保存每个商店中每个商品的买入/卖出价值。您可以在O(1)中轻松更新此数组
第二个数组,用于为每个项目的每个存储组合保留比率对象,如:
[
[aa, ab, ac],
[ba, bb, bc],
[ca, cb, cc]
]
// 3 stores, 1 item, each element is { r, a, b }
// r for ratio, a buy store, b sell store
你可以用O(n)来更新它⋅n) 例如,更新a:循环1到n,对于i=2,更新ab和ba
第三个数组,用于从上一个数组中保留同一对象,再加上修饰或分组。进行排序或分组将花费O((n⋅N⋅m) 日志(n)⋅N⋅m) )(是的,这是一个瓶颈,您需要注意这一点,方法取决于您的阵列形状)
在更大的范围内(或以上都没有帮助,对此表示抱歉)我认为,与其将所有数据发送到客户端,不如在服务器中聚合数据,然后通过web套接字发送。这似乎与我无关,因为它非常广泛,不是一个特定的编程问题。如果列表是一个位置的所有项,或者一个项的所有位置,或者h