Ich habe ein Array von Bytes und ich möchte feststellen, ob der Inhalt dieses Array von Bytes in einem anderen größeren Array als eine kontinuierliche Sequenz existiert. Was ist der einfachste Weg, dies zu tun?C# Array Subset holen
2
A
Antwort
3
Der naive Ansatz ist:
public static bool IsSubsetOf(byte[] set, byte[] subset) {
for(int i = 0; i < set.Length && i + subset.Length <= set.Length; ++i)
if (set.Skip(i).Take(subset.Length).SequenceEqual(subset))
return true;
return false;
}
Für eine effizientere Ansätze, könnten Sie erweiterte String-Matching-Algorithmen wie KMP betrachten.
3
Versuchen Sie, einen String-Suchalgorithmus anzupassen. Einer der schnellsten ist Boyer-Moore. Es ist auch ziemlich einfach. Für binäre Daten, Knuth-Morris-Pratt Algorithmus könnte auch sehr effizient arbeiten.
0
Dieses, das ein 1/1 Anschluss dieser Antwort lautet: Searching for a sequence of Bytes in a Binary File with Java
ist eine sehr effiziente Art und Weise, dies zu tun:
public static class KmpSearch {
public static int IndexOf(byte[] data, byte[] pattern) {
int[] failure = ComputeFailure(pattern);
int j = 0;
if (data.Length == 0) return -1;
for (int i = 0; i < data.Length; i++) {
while (j > 0 && pattern[j] != data[i]) {
j = failure[j - 1];
}
if (pattern[j] == data[i]) { j++; }
if (j == pattern.Length) {
return i - pattern.Length + 1;
}
}
return -1;
}
private static int[] ComputeFailure(byte[] pattern) {
int[] failure = new int[pattern.Length];
int j = 0;
for (int i = 1; i < pattern.Length; i++) {
while (j > 0 && pattern[j] != pattern[i]) {
j = failure[j - 1];
}
if (pattern[j] == pattern[i]) {
j++;
}
failure[i] = j;
}
return failure;
}
}
Verwandte Themen
- 1. Subset von Array in C#
- 2. Subset Summe Rekursion mit C++
- 3. Python Slice/Subset-Array mit unterschiedlichen Datentyp
- 4. C# - Einen verschachtelten JSON-Array-Wert holen
- 5. Subset-Grafik nach Etikett
- 6. Subset Datenrahmen mit R
- 7. Array holen oder Standardfunktion
- 8. Subset Summe Problem
- 9. PDO holen Array als Reihe
- 10. Multitasking C# | Array-Index aus dem Schrank holen
- 11. Subset data.table mit min Bedingung
- 12. neues Objekt holen täglich von Array
- 13. PHP: String aus Array holen?
- 14. php - mysql Array holen (LIKE%)
- 15. Holen Array-Werte mit sports_id
- 16. Subset und ggplot2
- 17. R dplyr Subset Alternative
- 18. Python: Wildcard-Subset-Import
- 19. Subset Operator in r
- 20. Subset basierend auf Variablenspaltenname
- 21. Subset data.table durch logische Spalte
- 22. Subset Datenrahmen mit Userinput glänzenden
- 23. C# readonly vs Holen
- 24. Operator [] C++ Holen/Setzen
- 25. Regressions-Subset-Algorithmus in R
- 26. Holen Sie sich das am meisten verwendete Byte-Array in einem Byte-Array in C#?
- 27. Subset einen Datenrahmen um mehrere Faktorstufen
- 28. Subset von Gruppe mit data.table
- 29. Subset in Python Ausgangsfehler - HackerRank
- 30. Subset Summe mit Nachbarschaftssuche - Java
Es ist ganz schrecklich ineffizient ... –
@Michal: Es ist O (n * m), die als ineffizient betrachtet werden könnte, aber wenn Sie sich Sorgen um Skip and Take machen, tun Sie das nicht. Dies ist so effizient wie ein Paar für Schleifen. Wie gesagt, wenn Leistung ein Problem ist, sollten Sie einen fortgeschritteneren Algorithmus in Erwägung ziehen. –
@Mehrdad - yeah, aber m * n kann ziemlich groß für binäre Daten werden ... Ich weiß, dass Skip() und Take() durch verzögerte Ausführung erledigt wird - also ist es nur eine Komponente von O (m * n) SequenceEquals ... –