多索引映射最优结构选型及Java实现优化咨询
问题
多索引映射需求:
- 一个值对应多个键,可通过键在亚线性时间(小于O(n))内查找值。
- 键非唯一,即存在
key1: val1、key1: val2、key1: val3的情况。 - 删除值时,需从映射中移除所有对应该值的键值对。
示例
Book队列结构
Book对应多个作者,可快速通过作者查找书籍。Book可并发添加或移除至队列。- 一个作者可撰写多本
Book。
处理流程
- 输入作者名称,查找队列中的任意一本对应书籍。
- 将该书籍从队列中移除。
我曾考虑使用类似multimap的结构,但遍历书籍作者时从映射中删除键值对的方案并不合适,当作者和书籍总数达百万级时,耗时会显著增加。
能否有人帮我确定合适的结构?
更新:
按照@gdomo的建议(书籍-作者、作者-书籍双向映射),我编写了如下Java代码:
public class Book { ... private List<String> authors; } Set<Book> pendingBooks = ConcurrentHashMap.newKeySet(); ConcurrentHashMap<String, Set<Book>> cacheMapBooksByAuthor = new ConcurrentHashMap<>(); public static void processAuthorCheck(String author) { Set<Book> books = cacheMapBooksByAuthor.put(author, ConcurrentHashMap.newKeySet()); if (books == null) return; for (Book book : books) { pendingBooks.remove(book); // 从队列中移除书籍 this.processBook(book); // TODO List<String> authors = book.getAuthors(); if (authors == null) continue; for (String author : authors) { cacheMapBooksByAuthor.get(author).remove(book); // 从其他作者的映射中移除该书 } } } public static void pushBook(Book book) { List<String> authors = book.getAuthors(); if (authors == null) return; for (String authors : authors) { Set<Book> books = cacheMapBooksByAuthor.get(authors); if (books == null) { Set<Book> oldBooks = cacheMapBooksByAuthor.putIfAbsent(authors, books = ConcurrentHashMap.newKeySet()); if (oldBooks != null) books = oldBooks; } books.add(book); } }
我使用Set替代Queue以避免书籍冲突。
但我不满意的一点是,在Java中释放Book变量不会影响作者映射中的Book引用(因Java对象引用机制)。
是否有比该结构更优的解决方案?
内容的提问来源于stack exchange,提问作者coding monster
相关产品推荐
相关产品推荐

