Bez iteracji po całej tablicy, jak mogę sprawdzić, czy x
w tablicy za pomocą Go? Czy język ma konstrukcję?
Jak Python: if "x" in array: ...
Bez iteracji po całej tablicy, jak mogę sprawdzić, czy x
w tablicy za pomocą Go? Czy język ma konstrukcję?
Jak Python: if "x" in array: ...
strings.Index
) pomaga uczynić bardziej oczywistym, co robi kod. Mam wrażenie, że może myślisz, że Pythonin array:
robi coś szybko / magicznie. AFAIK to nie jest. Wyraźne określenie pętli pomaga autorowi (i wszystkim czytelnikom) uświadomić sobie i rozważyć inne implementacje (np. Mapę).Odpowiedzi:
W Go nie ma wbudowanego operatora. Musisz iterować po tablicy. Aby to zrobić, możesz napisać własną funkcję:
Jeśli chcesz mieć możliwość sprawdzenia członkostwa bez iteracji po całej liście, musisz użyć mapy zamiast tablicy lub wycinka, jak poniżej:
źródło
Inne rozwiązanie, jeśli lista zawiera wartości statyczne.
np .: sprawdzanie poprawności wartości z listy prawidłowych wartości:
źródło
Oto cytat z książki „Programowanie w ruchu: tworzenie aplikacji na XXI wiek”:
https://play.golang.org/p/UIndYQ8FeW
źródło
n*log(n) + log(n)
dwie konsekwentne niezależne operacjePowyższy przykład z użyciem sortowania jest zamknięty, ale w przypadku łańcuchów wystarczy użyć SearchString:
https://golang.org/pkg/sort/#SearchStrings
źródło
sort.SearchStrings
.Właśnie miałem podobne pytanie i postanowiłem wypróbować niektóre sugestie z tego wątku.
Przeprowadziłem testy porównawcze najlepszych i najgorszych scenariuszy 3 rodzajów wyszukiwania:
oto kod funkcji:
w najlepszych przypadkach wybierz pierwszy element z listy, w najgorszym przypadku nieistniejąca wartość.
Oto wyniki:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Switch wygrywa do końca, najgorszy przypadek jest znacznie szybszy niż najlepszy. Mapy są najgorsze, a lista jest bliżej zmiany.
Morał brzmi: jeśli masz statyczną, względnie małą listę, instrukcja switch jest właściwym rozwiązaniem.
źródło
:
zamiast,
w instrukcji switch? Czy to przyspiesza?case
instrukcji zamiast jednej sprawy. Wyniki są zasadniczo takie same dla obu funkcji.Inną opcją jest użycie mapy jako zestawu. Używasz tylko kluczy, a wartość ma wartość logiczną, co zawsze jest prawdą. Następnie możesz łatwo sprawdzić, czy mapa zawiera klucz, czy nie. Jest to przydatne, jeśli potrzebujesz zachowania zestawu, a jeśli dodasz wartość wiele razy, będzie to tylko raz w zestawie.
Oto prosty przykład, w którym dodaję losowe liczby jako klucze do mapy. Jeśli ten sam numer zostanie wygenerowany więcej niż raz, nie ma to znaczenia, pojawi się na ostatecznej mapie tylko raz. Następnie używam prostego, jeśli sprawdź, czy klucz jest na mapie, czy nie.
Oto plac zabaw w ruchu
źródło
Jest to tak blisko, jak tylko mogę uzyskać naturalne odczucie operatora „in” Pythona. Musisz zdefiniować własny typ. Następnie możesz rozszerzyć funkcjonalność tego typu, dodając metodę typu „has”, która zachowuje się tak, jakbyś miał nadzieję.
Mam bibliotekę narzędzi, w której definiuję kilka typowych rzeczy takich jak ten dla kilku rodzajów wycinków, takich jak te zawierające liczby całkowite lub moje własne inne struktury.
Tak, działa w czasie liniowym, ale nie o to chodzi. Chodzi o to, aby zapytać i dowiedzieć się, jakie konstrukcje języka wspólnego ma Go, a czego nie. To dobre ćwiczenie. Czy ta odpowiedź jest głupia, czy użyteczna, zależy od czytelnika.
źródło