为什么没有任何实现(在 C、C++、Java 甚至 Python 中)完全持久(不一定是功能性)的链表,其修改次数具有恒定的时间/空间开销?
我想到的数据结构是本文中描述的: http://www.cs.cmu.edu/~sleator/papers/Persistence.htm
经过在谷歌上进行长时间搜索后,我什至无法找到具有上述开销的部分持久链表实现。
PS:我所说的持久性的定义是在以下维基百科页面中描述的: http: //en.wikipedia.org/wiki/Persistent_data_struct
编辑(问题被搁置后):
我认为提到的原因不适用于我的问题。我并不是完全要求在不同的可用图书馆之间进行推荐,因此不能有“固执己见的答案和垃圾邮件”。我的问题是令人惊讶的是,理论上应该很棒的数据结构却没有被任何已知的语言实现。因此,在我自己实现它之前,我问了这个问题,看看是否有这样的答案:“这很正常,数据结构 X 主导了您正在寻找的数据结构,这就是为什么尽管它很简单,但它尚未实现”。另一个答案可能是“它没有你想象的那么好,因为有一个很大的隐藏常量”或者“它与当今缓存的构建方式做得不太好”......如果我的问题不够清楚,我很抱歉。我改变了我的问题,使我的要求现在更加明确。
我有小矢量.它们中的每一个都由10个整数组成,这些整数介于0和15之间.这意味着矢量中的每个元素都可以使用4位写入.因此,我可以连接我的向量元素并将整个向量存储在单个long类型中(在C,C++,java ...中)
如果对于0,...,9,v1 [i]> = v2 [i]中的每个i,向量v1支配向量v2
我想写一个方法compare(long v1, long v2),如果非向量支配另一个,则返回0,如果第一个占优势,则返回1,如果第二个占优势,则返回-1.
除了获得每个i组件并进行正常整数比较的10倍之外,还有任何有效的方法来实现比较吗?
编辑
如果v1与v2完全相同则返回1或-1都很好
我正在使用cmake来管理使用第三方库的项目.
该库可以针对libc ++或libstd ++进行编译/链接(具体取决于版本).
我知道如何告诉cmake针对libc ++或libstdc ++编译/链接我的项目,但我不知道如何检查我使用的库是否是针对libc ++或libstd ++编译/链接的.是否有任何cmake命令来检查?
迭代中朱莉娅可以为新定义的类型通过实施具有3个功能迭代接口来实现:start,next,done
我看到这些函数的末尾没有惊叹号,所以根据我对julia命名约定的理解,这3个函数不应该修改它们的参数.特别是这两个循环应该给出相同的输出
state = start(iter)
while !done(iter, state)
(i, state) = next(iter, state)
@show i
end
state = start(iter)
while !done(iter, state)
(other_i, other_state) = next(iter, state)
(i, state) = next(iter, state)
@show i
end
Run Code Online (Sandbox Code Playgroud)
我错了吗?我问,因为我碰到了外部julia包中的一些迭代器而不尊重它.
如何检查 Julia 中的类型是否实现了接口?
例如迭代接口由函数start, next,实现done。
我需要的是根据参数类型是否实现给定的接口来对函数进行专门化。
编辑
这是我想做的一个例子。
考虑以下代码:
a = [7,8,9]
f = 1.0
s = Set()
push!(s,30)
push!(s,40)
function getsummary(obj)
println("Object of type ", typeof(obj))
end
function getsummary{T<:AbstractArray}(obj::T)
println("Iterable Object starting with ", next(obj, start(obj))[1])
end
getsummary(a)
getsummary(f)
getsummary(s)
Run Code Online (Sandbox Code Playgroud)
输出是:
Iterable Object starting with 7
Object of type Float64
Object of type Set{Any}
Run Code Online (Sandbox Code Playgroud)
这是我们所期望的,因为Set不是AbstractArray. 但显然我的第二种方法只需要类型 T 来实现迭代接口。
我的问题不仅与迭代接口有关,还与一组函数定义的所有接口有关。
编辑2
我认为我的问题与
https://github.com/JuliaLang/julia/issues/5
既然我们可以想象类似的事情T<:Iterable
initializer_list在使用-stdlib=libstdc++和时编译一个带有空函数的简单Hello文件时,我遇到了一个问题-std=c++11
如果我只使用-std=c++11(这意味着用libc ++编译)
然后文件编译并打印Hello!
如果我评论function_test,我同时使用-std=c++11和-stdlib=libstdc++
然后文件编译并打印Hello!
如果我保留这个功能function_test,我会同时使用-std=c++11和-stdlib=libstdc++
然后我收到以下错误:
$ g++ -stdlib=libstdc++ -std=c++11 -o test test.cpp
test.cpp:1:10: fatal error: 'initializer_list' file not found
#include <initializer_list>
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
这是我的档案
#include <initializer_list>
#include <iostream>
using namespace std;
void function_test(initializer_list<int> something){}
int main(int argc, char * argv[])
{
cout << "Hello!" << endl;
function_test({0});
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的苹果铿锵版
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr
--with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 …Run Code Online (Sandbox Code Playgroud)