use*_*651 5 algorithm data-structures
各种股票的数据不断来自各个证券交易所。哪种数据结构适合存储这些数据?
需要考虑的事情是:
a) 由于股票数据在交易期间每秒或微秒发生变化,因此需要有效地检索和更新数据。
我想到使用堆,因为股票的数量或多或少是恒定的,最常用的操作是检索和更新,因此堆在这种情况下应该表现良好。
b) 需要显示当前趋势的股票(如在特定日期出售的最活跃和最不活跃的股票数量,高利润和亏损)
我不确定如何解决这个问题。
c) 考虑到在特定时间交易的股票数量,使用任何编程语言存储到数据库都有一些延迟,你如何持久存储所有交易数据?
Ps:这是摩根士丹利的面试题。
堆不支持有效的随机访问(即按索引查找),也不支持在不删除元素的情况下获取前 k 个元素(这是不希望的)。
我的回答是这样的:
数据库将是这方面的首选,因为通过适当的表结构和索引,可以有效地完成所有必需的操作。
所以我想这更像是一个关于理解数据结构的理论问题(与内存存储相关,而不是持久化)。
似乎多种数据结构是要走的路:
a) 由于股票数据在交易时间内每秒或微秒发生变化,因此需要有效地检索和更新数据。
一张地图对这个有意义。哈希映射或树映射允许快速查找。
b) 如何显示当前趋势的股票(如在特定日期出售最活跃和最不活跃的股票数量,高利润和亏损)?
几乎任何排序的数据结构在这里似乎都有意义(上面的映射具有指向正确节点的指针,或指向同一节点)。一种用于活动,一种用于利润。
我可能会使用排序(双)链表。获取前 n 项或最后 n 项所需的时间最少。由于您有一个通过地图指向元素的指针,因此更新所需的时间与地图查找加上再次对其进行排序所需的该项目的移动次数(如果有)一样长。如果一个项目经常同时移动多个索引,那么链表将不是一个好的选择(在这种情况下,我可能会选择二叉搜索树)。
c) 如何持久存储所有交易数据?
我将这个问题理解为 - 如果与数据库的连接丢失或数据库在任何时候出现故障,您如何确保没有数据损坏?如果不是这样,我会要求改写。
几乎任何数据库课程都应该涵盖这一点。
据我所知 - 它与创建另一条记录,更新这条记录有关,并且只有在完全更新后才设置指向这条记录的真实指针。在此之前,您可能还必须设置一个指向旧记录的指针,以便您可以检查它是否已被删除,如果在设置指针之后但在删除之前发生某些事情。
另一种选择是拥有一个活动事务表,您可以在开始事务时将其添加到该表中,并在事务完成时从中删除(它还存储回滚或恢复事务所需的所有详细信息)。因此,每当一切正常时,您检查此表并回滚或恢复尚未完成的任何事务。
虽然这是一个与语言无关的问题,但我突然想到了一些要求。例如:
由于股票数据在交易期间每秒或微秒发生变化,因此需要有效地检索和更新数据。
java 类HashMap使用键值的哈希码来快速访问其集合中的值。它实际上具有O(1)运行时复杂性,这是理想的。
需要显示当前趋势的股票(如最活跃和最不活跃的股票销售量、特定日期的高利润和高亏损)
这是一个基于实施的问题。最好的选择是实现快速排序算法,例如QuickSort或Mergesort。
由于考虑到特定时间段内交易的股票数量,使用任何编程语言存储到数据库都会有一些延迟,那么如何持久存储所有交易数据?
数据库是我的第一选择,但这取决于您的资源。