问题是“查找具有从1到K的所有数字的列表的最小长度”。 输入: 列表,K,N 其中N是列表的长度
我的算法(显然有点面向C):
找到MIN的功能(参数:FSub,C,NewList,Min)
如果C等于空列表,则此操作停止
此算法似乎很耗时,在某些情况下,大列表可能会耗尽堆栈。
我asked关于第一个子列表部分,并获得了此代码。
findFirstSubListHavingAllColors( NumList, List ,SubList, Len):-
once((
append(SubList, _, List), % get SubList
subtract(NumList, SubList, []), % test whether NumList is contained in SubList
length(SubList, Len)
)).
我无法找到答案。
列表= [1,3,1,3,1,3,3,2,2,1],K = 3,N = 10
答案应为4,因为包含数字1,2,3的最小子列表为[1,3,3,2]或[3,2,2,1]。
答案 0 :(得分:0)
我认为这可行:
sublist(NumList, In, Out):-
append([_, Out, _], In),
forall(member(X, NumList), member(X, Out)).
minSubList(NumList, In, Out) :-
aggregate_all(min(Len, Out1),(sublist(NumList, In, Out1), length(Out1, Len)), Out).
例如:
?- minSubList([1,2,3], [1,3,1,3,1,3,3,2,2,1], Out).
Out = min(4, [1, 3, 3, 2]).
注意:我没有尝试过很大的列表。
答案 1 :(得分:0)
这是另一种解决方案,用于测试长度增加(从K到len(L))的子列表:
min_len(L, K, M):-
length(L, N),
numlist(1, K, LK),
once((
between(K, N, M),
length(SubL, M),
append([_, SubL, _], L),
subset(LK, SubL)
)).
测试案例:
?- min_len([1,3,1,3,1,3,3,2,2,1], 3, Min).
Min = 4