我正在尝试在 Java 中实现 Bentley-Ottmann 算法,但一直停留在实际实现处理交点时所需的交换操作(参见:维基百科上的 Bentley-Ottmann )。
如果我正确理解该算法,则有 3 种不同类型的事件点:
(我省略了很多细节,因为它们与这里不太相关)
我使用 aTreeMap
作为我的数据结构来存储我的段。我不认为有一个swap
操作TreeMaps
可以让你只交换两个元素,所以这就是我陷入困境的地方。
我正在尝试在序言中编写一个程序,查找所有素数达到极限N
,我试图通过使用埃拉托斯特尼筛法来实现这一点。我对序言非常陌生,所以我还没有真正掌握递归思考的艺术(你可能可以在我的代码中看到这一点)。
尽管如此,我(或多或少)尝试在序言中实现该算法,但并没有达到您将在此处看到的程度:
allPrimes(N, Primes) :-
numlist(2, N, Numlist),
A is round(sqrt(N)),
foreach(between(2, A, _i), sift(_i, Numlist, Primes)).
sift(_i, Numlist, Primes) :-
findall(_j, (member(_j, Numlist), _j \== _i, (_j mod _i =:= 0)), L),
subtract(Numlist, L, Primes).
Run Code Online (Sandbox Code Playgroud)
我不断获得false
输出,因为subtract(Numlist, L, Primes)
失败,我猜测它失败的原因是因为Primes
它已经被实例化并且它的值无法更改。我尝试过用其他方式解决这个问题,但无法想出解决方案。
非常感谢任何指导我正确方向的帮助!