关于O(1)的数据结构获取前缀

时间:2017-01-08 08:32:10

标签: java scala data-structures trie key-value-store

所以我试图在Scala中编写一个小实用程序,它不断地监视一堆目录以进行文件系统更改(删除,创建,修改等),并将其立即转发到远程服务器。 (https://github.com/Khalian/LockStep

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

{
  "localToRemoteDirectories": {
    "/workplace/arunavs/third_party": {
      "remoteDir": "/remoteworkplace/arunavs/third_party",
      "remoteServerAddr": "some Remote server address"
    }
  } 
}

此配置存储在Scala Map中(key = localDir,value =(remoteDir,remoteServerAddr))。元组表示为案例类

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等)。问题是发送的事件是绝对路径(例如,如果我创建一个文件helloworld在third_party目录中,演员发送的消息是(ENTRY_CREATE,/ workplace / arunavs / third_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是我配置中的项目数。我正在寻找更好的计算复杂性(我看了基数和patricia尝试,但他们不切断它,因为我喂一个字符串并试图获取作为前缀的键,尝试解决相反的问题)。

0 个答案:

没有答案