【问题标题】:What data structure will optimzied to represent stock market?将优化哪些数据结构来代表股票市场?
【发布时间】:2013-04-18 09:58:38
【问题描述】:

各种股票的数据源源不断地来自各个证券交易所。哪种数据结构适合存储这些数据?

要考虑的事情是:

a) 由于股票数据在交易期间每秒或微秒发生变化,因此需要有效地检索和更新数据。

我想使用堆,因为库存的数量或多或少是恒定的,并且最常用的操作是检索和更新,因此堆在这种情况下应该表现良好。

b) 需要显示当前趋势的股票(如在特定日期最活跃和最不活跃、高盈亏的股票数量)

我不确定如何解决这个问题。

c) 考虑到将在特定时间交易的股票数量,使用任何编程语言存储到数据库都会有一些延迟,您如何持久存储所有交易数据??

Ps:这是摩根士丹利的面试题。

【问题讨论】:

  • 听起来你做得不太好。

标签: algorithm data-structures


【解决方案1】:

堆不支持有效的随机访问(即按索引查找),也不支持在不删除元素的情况下获取前 k 个元素(这是不希望的)。

我的回答是这样的:

数据库将是首选,因为有了适当的表结构和索引,所有必需的操作都可以高效完成。

所以我想这更多是关于理解数据结构的理论问题(与内存存储相关,而不是持久性)。

似乎多个数据结构是要走的路:

a) 由于股票数据在交易期间每秒或微秒发生变化,因此需要有效地检索和更新数据。

一张地图对这个很有意义。哈希图或树图允许快速查找。

b) 如何显示当前趋势的股票(如在特定日期最活跃和最不活跃、高盈亏的股票数量)?

几乎任何排序的数据结构在这里似乎都是有意义的(上面的映射有指向正确节点的指针,或者指向同一个节点)。一种用于活动,一种用于盈利。

我可能会使用排序(双)链表。获取第一个或最后 n 个项目需要最少的时间。由于您通过地图有一个指向元素的指针,因此更新所需的时间与地图查找时间加上该项目再次排序所需的移动次数(如果有的话)一样长。如果一个项目经常一次移动多个索引,则链表不是是一个好的选择(在这种情况下,我可能会选择二叉搜索树)。

c) 如何持久存储所有事务数据?

我将这个问题理解为 - 如果与数据库的连接丢失或数据库在任何时候出现故障,您如何确保没有数据损坏?如果不是这样,我会要求改写。

几乎任何数据库课程都应该涵盖这一点。

据我所知 - 它与创建另一条记录、更新这条记录以及只有在它完全更新后才设置指向这条记录的真实指针有关。在此之前,您可能还必须设置一个指向旧记录的指针,以便您可以检查它是否已被删除,如果在设置指针之后但在删除之前发生了某些事情。

另一种选择是拥有一个活动事务表,您可以在开始事务时添加该事务表,并在事务完成时删除该表(该表还存储回滚或恢复事务所需的所有详细信息)。因此,只要一切正常,您就检查此表并回滚或恢复任何尚未完成的事务。

【讨论】:

  • “如果一个项目经常同时移动多个索引”是什么意思
  • 在“如果一个项目经常同时移动多个索引,链接列表将不是一个好的选择”这一行中
  • @ASharma7 我的意思是如果一次购买或出售许多单位的股票,这会导致它超过许多其他股票,因此必须在列表中移动很远。对于 O(距离)的链表,对于二叉搜索树,它是 O(log(股票数量))。虽然我不认为会有很多交易导致股票在列表中移动很多位置。
【解决方案2】:

如果我必须选择,我会选择 Hash Table

原因:它是同步且线程安全的,BigO(1)为平均案例复杂度。

提供: 1.良好的哈希函数,避免碰撞。 2. 高性能缓存。

【讨论】:

    【解决方案3】:

    虽然这是一个与语言无关的问题,但我突然想到了一些要求。例如:

    由于股票数据在交易期间每秒或微秒发生变化,因此需要有效地检索和更新数据。

    java 类HashMap 使用键值的哈希码来快速访问其集合中的值。它实际上具有O(1) 运行时复杂度,这是理想的。

    需要显示当前趋势的股票(如在特定日期最活跃和最不活跃、高盈亏的股票数量)

    这是一个基于实现的问题。最好的办法是实现快速排序算法,例如 QuickSortMergesort

    考虑到将在特定时间交易的股票数量,使用任何编程语言存储到数据库都会有一些延迟,您如何持久存储所有交易数据??

    数据库本来是我的首选,但这取决于您的资源。

    【讨论】:

    • 纳斯达克使用 SQL Server 数据库,而且有很多,上次我检查过。似乎是一个非常学术的问题。
    • 如果您一直对数据进行重新排序,您将不会走多远。当然,这是一个基于实施的问题——这就是问题所在。 ——第三个答案真的只是投降。
    猜你喜欢
    • 2013-01-04
    • 2017-11-28
    • 1970-01-01
    • 2012-05-22
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多