Załóżmy, że mam listy ciągów znaków, gdzie każdy łańcuch jestOdnajdywanie pikseli, które sprawiają, że obraz jest unikalny na liście, można poprawić na brutalnej sile?
- dokładnie długości 4 znaków i
- unikalna w obrębie listy.
Dla każdego z tych napisów chcę zidentyfikować pozycję znaków w ciągu znaków, które powodują, że ciąg jest niepowtarzalny.
Więc do listy trzech ciągów
abcd
abcc
bbcb
dla pierwszego łańcucha Chcę określić charakter w 4 pozycji d od d nie pojawiają się na 4 pozycji w inny ciąg.
Dla drugiego ciągu chcę zidentyfikować znak na 4. pozycji c.
Na trzecim ciągiem go Chcę określić charakter w 1. pozycji b i charakteru w 4 pozycji, także b.
To może być zwięźle przedstawiony jako
abcd -> ...d
abcc -> ...c
bbcb -> b..b
Jeśli wziąć pod uwagę ten sam problem, ale z listą liczb binarnych
0101
0011
1111
Następnie wynik chcę byłoby
0101 -> ..0.
0011 -> .0..
1111 -> 1...
Pozostając z motywem binarnym mogę użyć XOR, aby zidentyfikować, które bity są unikatowe w ramach dwa binarne numery od
0101^0011 = 0110
które można interpretować w ten sposób, że w tym przypadku 2 i 3 bity (czytanie od lewej do prawej) są unikalne między tymi dwoma liczb binarnych. Ta technika może być czerwonym śledziem, chyba że w jakiś sposób może zostać rozszerzona na większą listę.
Metoda brute-force polegałaby na analizie każdego ciągu po kolei, a dla każdego ciągu na iterację pionowych wycinków pozostałych łańcuchów na liście.
Tak na liście
abcd
abcc
bbcb
chciałbym zacząć
abcd
i iterację pionowe plastry
abcc
bbcb
gdzie te pionowe plastry byłoby
a | b | c | c
b | b | c | b
lub w formie listy, "ab", "bb", "cc", "cb".
Spowodowałoby czterech porównaniach
a : ab -> . (a is not unique)
b : bb -> . (b is not unique)
c : cc -> . (c is not unique)
d : cb -> d (d is unique)
lub zwięźle
abcd -> ...d
Może to myślenie życzeniowe, ale mam wrażenie, że nie powinno być elegancki i ogólnie rozwiązanie, które miałyby zastosowanie do dowolnie duża lista ciągów (lub liczb binarnych). Ale jeśli jest, nie byłem jeszcze w stanie tego zobaczyć.
Mam nadzieję, że wykorzystam ten algorytm, aby wyprowadzić minimalne sygnatury z kolekcji unikatowych obrazów (bitmap) w celu sprawnej identyfikacji tych obrazów w przyszłości. Gdyby w przyszłości wydajność nie była problemem, użyłbym prostego skrótu każdego obrazu.
Czy możesz poprawić brutalną siłę?
Edit Podejście mam ogrzaniu do buduje mapę pikseli obrazów
sprawl[Tuple<x=10, y=33,color=f1fefd>] => {
image17,
image23,
...
}
sprawl[Tuple<x=10, y=34,color=f1fef0>] => {
image11
...
}
a następnie za pomocą tej mapy, aby określić minimalny zestaw sygnatur pikseli dla każdego obrazu.
Jeśli piksel (oznaczony przez x, y, kolor) odwołuje się do jednego obrazu, to znalazłem idealną (minimalną) sygnaturę dla tego obrazu.
To jest bardziej skomplikowane, jeśli obraz nie ma unikatowych pikseli, ale ponieważ wiem, że wszystkie obrazy są unikatowe na liście, powinienem móc połączyć dwa lub więcej odnośników pikseli (ale tak mało jak to możliwe), aby wydedukować obraz.
Aktualizacja
pracuję na algorytmie do tego. Mój problem jest bardzo podobny do this one, a mój algorytm został zapisany jako answer to that question. Ta aktualizacja ma na celu zwrócenie uwagi każdego, kto nadal go obserwuje (widzę pięć zakładek). Pracuję nad tym w odosobnieniu, więc wszelkie opinie są mile widziane, nawet jeśli tylko zauważam, że nie wyraziłem się jasno!
Jeśli dodasz bbcd do listy, niektóre z twoich przedmiotów nie będą miały unikalnych znaków. Jak wpłynie to na twój cel? –
@Kathy W takim przypadku nie byłbym w stanie uzyskać podpisów, których szukam. W przypadku aplikacji, w której mam nadzieję wykorzystać ten algorytm, scenariusz jest możliwy, ale mało prawdopodobny. –
@Ed Guiness, czy możesz opisać część "bardziej efektywnie identyfikować obrazy w przyszłości"? Czy otrzymasz obraz i musisz powiedzieć, czy jest to jedna z tych, dla których masz podpis? Czy zostaniesz poproszony o znalezienie konkretnego obrazu (z którego masz podpis) w ramach nieznanego zestawu obrazów? Jeśli to pierwsze, to idziesz o tym źle. Jeśli to drugie, twój pomysł podpisu jest dobry (możliwy do wykonania lub nie). –