Is there a function that returns true or false whenever one vector is a subvector from another? issubset() does not implies order.
Thanks!
Is there a function that returns true or false whenever one vector is a subvector from another? issubset() does not implies order.
Thanks!
I don’t believe so, but you could roll your own pretty easily.
setdiff()
is order-sensitive so you can probably use it in combination with isempty
?
One proposal:
function issubvec(sv, v)
ix = Int64[]
for s in sv
i = findfirst(==(s), v)
isnothing(i) && return false
push!(ix, i)
end
return (length(ix) == length(sv)) && issorted(ix)
end
Examples:
sv = [7, 3, 5]
issubvec(sv, collect(1:10)) # false
issubvec(sv, [1, 7, 2, 3, 5, 4]) # true
issubvec(sv, []) # false
issubvec(sv, [3, 5, 7]) # false
issubvec([], [3, 5, 7]) # true
issubvec([], []) # true
A non-allocating (and a bit faster) version would be:
function issubvec(sv::AbstractVector, v::AbstractVector)
i = firstindex(v)
for s in sv
i = findnext(==(s), v, i)
isnothing(i) && return false
i += 1
end
return true
end
After all the fat of the Christmas holidays, this pretty lean code by @bkamins is quite healthy.