宽松基数平衡树(RRB-trees)是不可变向量(在Clojure和Scala中使用)的推广,它具有"有效恒定"的索引和更新时间.RRB树保持有效的索引和更新,但也允许有效的连接(log n).
作者以我难以理解的方式呈现数据结构.我不太清楚每个节点维护的不变量.
在2.5节中,他们描述了他们的算法.我认为他们确保索引到节点只需要在基数搜索后进行线性搜索的额外步骤.我不明白他们是如何得出他们的额外步骤的公式,我想也许我不确定每个变量是什么意思(特别是"总共p个子树分支").
RRB树连接算法的工作原理是什么?
我想知道:编写与用户或其他程序通过stdin和stdout交互的Clojure程序的最佳方法是什么?
显然,有可能编写某种命令式循环,但我希望找到一些更懒惰/功能的东西,有点受Haskell的"交互"功能的启发.
command-line functional-programming interactive clojure lazy-evaluation
我有一个复杂的Clojure数据结构,我想序列化 - 基本上我正在开发的在线游戏的整个当前游戏状态,以便我可以实现保存游戏文件.
我的要求是:
有什么好建议吗?
我需要非常有效地比较Clojure/Java中的两个映射,并返回由Java的.equals(..)确定的差异,其中nil/null等效于"not present".
即我正在寻找一种最有效的方式来编写如下函数:
(map-difference
{:a 1, :b nil, :c 2, :d 3}
{:a 1, :b "Hidden", :c 3, :e 5})
=> {:b nil, :c 2, :d 3, :e nil}
Run Code Online (Sandbox Code Playgroud)
我更喜欢不可变的Clojure映射作为输出,但如果性能提升很重要,Java映射也会很好.
对于它的价值,我的基本测试用例/行为期望是对于任何两个映射a和b,以下将是相等的(最多等于null ="Not present"):
a
(merge b (difference a b))
Run Code Online (Sandbox Code Playgroud)
实现这个的最佳方法是什么?
我有一个大的有向无环图,我想在位图图像中可视化.
理想情况下,我希望将所有根节点放在图像的顶部,并且底部的所有叶节点,即图形边缘都指向向下的方向.
是否有一个很好的算法来计算满足这些约束的所有节点的坐标并产生良好的可视化效果?
visualization data-visualization graph graph-visualization directed-acyclic-graphs
我正在开发一个应用程序,我需要在一个可能非常大的不同机器集群中分配一组任务.
理想情况下,我想在Clojure中使用一种非常简单,惯用的方法,例如:
; create a clustered set of machines
(def my-cluster (new-cluster list-of-ip-addresses))
; define a task to be executed
(deftask my-task (my-function arg1 arg2))
; run a task 10000 times on the cluster
(def my-job (run-task my-cluster my-task {:repeat 10000})
; do something with the results:
(some-function (get-results my-job))
Run Code Online (Sandbox Code Playgroud)
如果能在集群上做Map-Reduce之类的话也可以获得奖励......
实现这样的目标的最佳方法是什么?也许我可以包装一个合适的Java库?
更新:
感谢Apache Hadoop的所有建议 - 看起来它可能符合要求,但是它看起来有点像矫枉过正,因为我不需要像Hadoop那样使用分布式数据存储系统(即我不需要处理数十亿条记录)...更轻量级的东西,专注于计算任务,如果存在的话,它会更好.
我有一个在Maven中管理的项目,它有一些本机依赖项(LWJGL).
一切都在开发中工作正常,但现在我想设置Maven,以便它可以构建一个可以重新分发的可运行的.jar文件.特别是,我希望用户可以非常轻松地运行应用程序,而无需乱搞库路径或解压缩本机库等.
目前我能够构建一个包含所有依赖项的.jar文件,但是如果我运行它(不出所料)我得到一个不满意的链接错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.libr
ary.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at org.lwjgl.Sys$1.run(Sys.java:73)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
at org.lwjgl.Sys.loadLibrary(Sys.java:95)
at org.lwjgl.Sys.<clinit>(Sys.java:112)
at org.lwjgl.opengl.Display.<clinit>(Display.java:132)
at glaze.TestApp.start(TestApp.java:10)
at glaze.TestApp.main(TestApp.java:31)
Run Code Online (Sandbox Code Playgroud)
显然,我可以通过手动安装本机库并运行jar来使其工作,java -Djava.library.path=/path/to/libs但这不是我期望用户做的事情.
这是pom.xml,如果它是相关的:https://github.com/mikera/glaze/blob/master/pom.xml
可以设置Maven,以便创建一个包含本机依赖项的可运行.jar,并在双击时成功运行?
假设我有一个"类似函数"的记录,至少在某种意义上它表示可以应用于某些参数的操作.
通过实现clojure.lang.IFn,我可以使它作为一个函数工作,如:
(defrecord Func [f x]
clojure.lang.IFn
(invoke [this arg]
(f x arg))
(applyTo [this args]
(apply f x args)))
((->Func + 7) 1)
=> 8
Run Code Online (Sandbox Code Playgroud)
(是的,我知道我刚刚重新实现了partial...... 的劣质版本......这只是一个例子:-))
制作唱片clojure.lang.IFn的好习惯吗?
这种方法有任何陷阱吗?
我正在使用带有core.async的Clojure,并且我希望对通过通道处理的消息数量设置速率限制.
特别是我想:
实现这一目标的最佳方法是什么?
我最近很高兴看到关于Go Concurrency模式的Google IO谈话
虽然Go的并发方法(灌浆,通道上的通信)明显不同于Clojure(不变性,管理参考,STM),但似乎Go方法在Clojure上下文中的某些情况下仍然有用.
因此,在Clojure或Java中可以直接使用Go的并发原语(可能是库),特别是:
channel类似的对象阻塞,直到两端都有读写器select样构造,可以等待在多个通道的结果PS非常满意Java解决方案,因为它很容易从Clojure中使用
更新自问题最初被问到以来,Clojure现在拥有core.async,它提供了所有这些功能和更多功能.
clojure ×8
java ×5
algorithm ×2
channel ×1
command-line ×1
concurrency ×1
core.async ×1
deployment ×1
function ×1
go ×1
goroutine ×1
graph ×1
hashmap ×1
interactive ×1
jar ×1
maven ×1
messaging ×1
native ×1
record ×1
scala ×1
tree ×1