جلب مجموعة فرعية من C#
سؤال
لدي مصفوفة من البايتات وأريد تحديد ما إذا كانت محتويات مصفوفة البايتات هذه موجودة ضمن مصفوفة أخرى أكبر كتسلسل مستمر.ما هي أبسط طريقة للقيام بذلك؟
المحلول
والمنهج الساذج هو:
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;
}
للحصول على أساليب أكثر كفاءة، قد تفكر في خوارزميات مطابقة السلسلة الأكثر تقدمًا مثل كمب.
نصائح أخرى
وحاول أن تكيف بعض خوارزمية البحث السلسلة. واحدة من أسرع هو بوير مور . فإنه من السهل جدا أيضا. لالبيانات الثنائية، كانوث-موريس-برات أ > الخوارزمية قد تعمل بكفاءة جدا أيضا.
وهذا، وهو ميناء 1/1 من هذه الإجابة: <لأ href = "https://stackoverflow.com/questions/1507780/searching-for-a-sequence-of-bytes-in-a-binary -file-مع جافا "> هل تبحث عن تسلسل بايت في ملف ثنائي مع جاوة
هل وسيلة فعالة جدا للقيام بذلك:
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;
}
}
لا تنتمي إلى StackOverflow