Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Java 以日志(n)时间插入和更新,性能更佳_Java_Algorithm_Dictionary_Binary Search Tree - Fatal编程技术网

Java 以日志(n)时间插入和更新,性能更佳

Java 以日志(n)时间插入和更新,性能更佳,java,algorithm,dictionary,binary-search-tree,Java,Algorithm,Dictionary,Binary Search Tree,我正在使用Java开发一些金融算法。我有一个复杂的数据结构,有许多属性需要在算法的生命周期内更新。有时此数据结构会更新1000次以上 为了提高性能,特别是对于get(search)/update/insert,我决定使用TreeMap作为一个在这方面非常有效的容器 现在是挑战部分。我需要更新数据结构属性,我需要从容器中检索数据结构属性,这需要: 检查容器是否具有该对象 如果是,则获取对象,否则创建新对象并添加到地图 更新容器中存在的对象 这个过程需要三个日志(n),即检查、获取和放置。我想在单日

我正在使用Java开发一些金融算法。我有一个复杂的数据结构,有许多属性需要在算法的生命周期内更新。有时此数据结构会更新1000次以上

为了提高性能,特别是对于
get(search)/update/insert
,我决定使用
TreeMap
作为一个在这方面非常有效的容器

现在是挑战部分。我需要更新数据结构属性,我需要从容器中检索数据结构属性,这需要:

  • 检查容器是否具有该对象
  • 如果是,则获取对象,否则创建新对象并添加到地图
  • 更新容器中存在的对象
  • 这个过程需要三个日志(n),即检查、获取和放置。我想在单日志(n)时间内完成此操作

    为此,我的解决方案是:

    我总是使用
    put
    在地图中添加对象(
    insert/update/get
    put
    返回旧对象,我用旧值更新当前对象,这解决了log(n)问题,但不同的对象丢失了对前一个对象的引用,因为新值在映射中被替换

    是否有更好的解决方案或更好的容器来更新数据结构。我可以使用
    列表
    并使用集合的二进制搜索,但为此,我需要再次对数据结构进行排序,因为列表未排序


    请导游

    我认为你做得很好

    O(k.log(n))=O(log(n))


    其中k是常数。因此,您的时间复杂度实际上是
    O(log(n))

    如果切换到,您可以在一次点击中实现
    1
    2
    。它返回新/旧对象,以便您可以更新它


    如果是Java-7,那么这需要一个额外的
    新的
    ——如果构建成本很高,这可能是一件坏事。

    如果您不害怕周围有可变对象(您似乎已经给出了建议的解决方案),您可以通过1-2个操作来完成。而不是

    1. contains()
    2a. exists? get(), modify, put()
    2b. doesn't exist? create, put()
    
    你可以这么做

    1. get()
    2a. null? create put()
    2b. not-null? modify object contents, as you already have reference
    
    这样,现有对象的搜索操作为1,不存在对象的搜索操作为2

    如果您想进一步改进它,可能需要使用ConcurrentHashMap(在您克服对hashcodes的不信任之后)和PutiFebsent

    1. old = putIfAbsent(createFresh())
    2. old not null? update old
    

    综上所述,对于比单个方法的生命周期更长的事情,我通常会尽量避免可变对象。在某个时候,您可能希望多线程处理,而拥有可变的东西将使处理变得更加复杂。但是有各种各样的权衡(比如内存压力),所以这取决于你。但请认真研究hashmaps,不管对象(im)是什么,它们可能是您在这里能做的最大优化易变性。

    您不使用
    哈希映射有什么原因吗?
    ?当我们有许多对象映射到单个哈希/键时,哈希映射会转换为LinkedList,这是不好的。您应该编写哈希函数以减少冲突。从思想上讲,这很好,但哈希函数在长期运行中仍然无法解决问题。我不确定为什么您不信任哈希映射,但它们是更好的解决方案,除非您依赖于排序。我建议您使用非平凡大小的映射对您的特定情况进行一些测试,以查看差异。谢谢,但是当添加新值时对象引用丢失,这意味着我看不到使用TreeMap的任何缺点。3倍Log(n)不会影响性能,正如我所说,它是一个常数。如果你仍然想让它只记录(n)不,你不需要在空间复杂性上妥协。像ComputeFabSent/merge这样的方法将是纯日志(n),没有额外的存储需求。非常感谢,我还不知道ConcurrentMap中添加了ComputeFabSent(计算、合并等)。