【问题标题】:Borrowing books a library data structure借书一种图书馆数据结构
【发布时间】:2011-02-12 21:06:08
【问题描述】:

首先,我想提一下这个问题是一个家庭作业问题。 我对实现的思考已经够久了。

我必须思考并实现一个具有以下功能的库软件:

  1. 添加/删除新订阅者。
  2. 借/还书。
  3. 以下订阅者有哪些书籍?
  4. 哪个订阅者持有以下书籍?
  5. 拥有最多书籍的订阅者列表。

我想实现一个堆和2个红黑树,问题是空间复杂度很高。所以我想知道我是否遗漏了什么。

订阅者由 I.D 存储,书籍有代号。 一棵红黑树是给订户的,另一棵是给借来的。 堆是一个最大堆,以实现最后一个要求。

除了数据结构,我不能使用其他任何东西。

感谢任何见解和答案。

【问题讨论】:

  • 你能扩展吗?您的 R-B 树是一棵用于订阅者,一棵用于书籍?也许哈希表在这里值得考虑。此外,仅用于 req 5 的堆似乎有点矫枉过正,应该可以使用双向链表的双向链表在 O(1) 时间开销中跟踪每个借用/返回操作的开销。但这可能意味着您的 person 对象需要了解 DLL,这从设计的角度来看并不好。
  • 嗯,你是对的,一 rb 是给订户的,一 rb 是给借来的书的。仅此而已,但我需要返回订阅者列表 O(n) 会很好,但不能像这样 O(n) 。我坚持将数据结构组合在一起并使用哈希表进行某种 EAV 建模模式,搜索将花费更长的时间(可能 O(n)。并且可能存在冲突)。

标签: data-structures computer-science software-design


【解决方案1】:

我猜你也可以使用容器,比如结构体?使用:

  • 书籍的一个哈希集/哈希表:
    另外存储一个标志,用于确定图书是否被借以及借给的订阅者。
  • 来自订阅者->图书链接列表的哈希映射,不仅存储所有订阅者,还存储他们借阅的图书。

这允许您在 O(1) 中执行所有列出的任务,除了按订阅者借阅的书籍数量排序之外。

【讨论】:

  • 我实际上只需要使用原始数据结构(我在课程中学到的那些)所以我非常有限,否则我会使用一个treap,而不是我可以在bst 和当前借书的数量。
  • @Shlomi 你能列出那些原始数据结构吗?
  • @Dave 我可以使用 BST、RB 树、哈希表、链接列表(双和单)、堆栈、队列和最小/最大堆。我可以扩展其他数据结构,但我需要证明它们的正确性(以及它们的属性)。
  • 顺便说一句,我可能没有提到,但我必须实现这些结构(意味着我不能使用任何库或已经原生)。
  • 由于您必须(以编程方式)实现它们,您还可以定义结构来存储您的实体的附加信息。哈希映射只不过是一个以对作为元素的哈希集/表。您是否必须满足任何时间复杂度界限?如果不是,我只会为最后一个要求编写一个排序 - 不应该伤害任何人。
猜你喜欢
  • 2015-05-27
  • 2021-12-11
  • 2011-03-26
  • 1970-01-01
  • 2022-09-23
  • 2022-07-20
  • 2016-02-05
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多