سؤال

لدي مصفوفة من البايتات وأريد تحديد ما إذا كانت محتويات مصفوفة البايتات هذه موجودة ضمن مصفوفة أخرى أكبر كتسلسل مستمر.ما هي أبسط طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

والمنهج الساذج هو:

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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top