Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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 关于O(1)get on前缀的数据结构_Java_Scala_Data Structures_Trie_Key Value Store - Fatal编程技术网

Java 关于O(1)get on前缀的数据结构

Java 关于O(1)get on前缀的数据结构,java,scala,data-structures,trie,key-value-store,Java,Scala,Data Structures,Trie,Key Value Store,因此,我试图在Scala中编写一个小实用程序,它不断地侦听一组目录中的文件系统更改(删除、创建、修改等),并将其立即同步到远程服务器。() 我的配置存储在JSON中,如下所示:- { "localToRemoteDirectories": { "/workplace/arunavs/third_party": { "remoteDir": "/remoteworkplace/arunavs/third_party", "remoteServerAddr": "

因此,我试图在Scala中编写一个小实用程序,它不断地侦听一组目录中的文件系统更改(删除、创建、修改等),并将其立即同步到远程服务器。()

我的配置存储在JSON中,如下所示:-

{
  "localToRemoteDirectories": {
    "/workplace/arunavs/third_party": {
      "remoteDir": "/remoteworkplace/arunavs/third_party",
      "remoteServerAddr": "some Remote server address"
    }
  } 
}
此配置存储在Scala映射中(key=localDir,value=(remoteDir,remoteServerAddr))。元组表示为一个case类

sealed case class RemoteLocation(remoteDir:String, remoteServerAddr:String)
我正在使用来自第三方的演员:

https://github.com/lloydmeta/schwatcher/blob/master/src/main/scala/com/beachape/filemanagement/FileSystemWatchMessageForwardingActor.scala) 
它侦听这些目录(例如/workplace/arunavs/third_party),然后输出一个Java 7 WatchKind事件(event_CREATE、event_MODIFY等)。问题是发送的事件是绝对路径(例如,如果我在third_party dir中创建一个文件helloworld,则参与者发送的消息是(条目创建/workplace/arunavs/third\u party/helloworld))

我需要一种方法来编写一个getter,从上面存储的配置映射中获取最近的前缀。显而易见的方法是在映射上进行筛选:-

def getRootDirsAndRemoteAddrs(localDir:String) : Map[String, RemoteLocation] =
    localToRemoteDirectories.filter(e => localDir.startsWith(e._1))

这只是返回作为localDir前缀的键的子集(在上面的示例中,使用localDir=/workplace/arunavs/third_party/helloworld调用此方法)。虽然这样做有效,但此实现是O(n),其中n是我配置中的项数。我正在寻找更好的计算复杂性(我查看了radix和patricia的尝试,但他们没有剪切它,因为我输入一个字符串并尝试获取作为前缀的键,尝试解决相反的问题)。

虽然问题很有趣,但我猜这O(N)的成本查找完全可以忽略不计,尤其是与监视文件系统、从磁盘读取文件并通过网络将它们发送到远程系统所需的时间相比。是的,与IO相比,内存操作所需的时间要少几个数量级,我的工程师想看看是否有更好的方法。我会使用一个树,其中节点“workplace”的子节点存储在HashMap中。当您获得像/workplace/foo/bar这样的路径时,在根映射(O(1))中找到节点“workplace”,然后在workplace的子节点映射(O(1))中找到foo,直到您再也找不到子节点为止。在Java中,您将使用TreeMap(实现NavigableMap接口)。这个接口有几种方法来查找最接近给定密钥(上一个或下一个)的密钥。我相信是O(logn)。