Получение индекса подмассива в Юлии - PullRequest
2 голосов
/ 05 октября 2019

Я новичок в Юлии и задаюсь вопросом, как лучше всего получить индекс подмассива, рассмотрим следующий массив векторов

vec = [[1, 2, 3], [4, 5, 6]]

Я хотел бы получить индекс элемента [4, 5, 6], однако я не могу использовать getindex(), выполнение следующего кода:

getindex(vec, [1, 2, 3])

дает:

BoundsError: attempt to access 2-element Array{Array{Int64,1},1} at index [[1, 2, 3]]

Так что мне интересно, есть ли эффективные встроенные методы дляделая это. Конечно, я могу отобразить этот массив векторов в другой массив чисел и выполнить поиск в новом массиве чисел, но это не совсем то, что я ожидаю.

Второй вопрос: как мне узнать больше о методах поиска в Юлии и их производительности? Я предполагаю, что теоретическая скорость поиска равна \sqrt(N), однако в зависимости от определенного метода реальное время кода может значительно различаться.

Ответы [ 2 ]

4 голосов
/ 05 октября 2019

Судя по названию функции, вы можете ввести в заблуждение: getindex возвращает значение , хранящееся в индексе .

Если вы хотите найти index чего-либо в массиве, который вы можете использовать find * методами findfirst, findall ...

julia> vec=[[1,2,3],[4,5,6]]
2-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [4, 5, 6]

julia> i = findfirst(x->x==[4,5,6],vec)
2

julia> vec[i]
3-element Array{Int64,1}:
 4
 5
 6

Относительно вашего второго вопроса:

Лучше всего ознакомиться с алгоритмами поиска / сортировки в целом (например, https://codeburst.io/algorithms-i-searching-and-sorting-algorithms-56497dbaef20?gi=3bdbf8cbaca0),, поскольку производительность зависит в большей степени от выбранного алгоритма, чем от конкретной языковой реализации. Например, временная сложность может сильно отличаться (O (n),O (журнал (п), ...).

3 голосов
/ 05 октября 2019

Я думаю, вы неправильно поняли, что делает getindex. Эта функция вызывается [], поэтому

julia> getindex(vec, 2)
3-element Array{Int64,1}:
 4
 5
 6

Все методы поиска (или «поиска») в Julia принимают функцию в качестве первого аргумента и находят, где функция оценивается как true,Чтобы найти определенный элемент, используйте isequal или == (они эквивалентны):

julia> findall(==([1,2,3]), vec)
1-element Array{Int64,1}:
 1
...