Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 高效的[JS?]算法,用于列出和更新多个地点的买入/卖出价格_Javascript_Vue.js_Vuetify.js - Fatal编程技术网

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元素可能是一个非常大的问题
您将如何实现这一点

因此,在本例中,我将使用分页或聚合(例如,每个项目的前10个最高比率)

例如:

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