سؤال

وحصلت على الغريب من قبل جون Limjap في مقابلة حادث وبدأت في البحث عن طرق فعالة ل القيام الكشف سياق متناظر. راجعت إجابات سياق متناظر الغولف ويبدو لي أنه في إجابات نوعان من خوارزميات فقط، عكس سلسلة و التحقق من الذيل والرأس.

def palindrome_short(s):
    length = len(s)
    for i in xrange(0,length/2):
        if s[i] != s[(length-1)-i]: return False
    return True

def palindrome_reverse(s):
    return s == s[::-1]

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

وهناك طريقة جيدة قد يكون parallelizing النسخة الأولى في نهج الانقسام وتسد، وتكليف زوج من المصفوفات شار 1..n وطول-1-n..length-1 لكل موضوع أو المعالج.

وماذا سيكون طريقة أفضل؟

هل تعرف أي؟

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

المحلول

ونظرا سياق متناظر واحد فقط، سيكون لديك للقيام بذلك في O (N)، نعم. يمكنك الحصول على مزيد من الكفاءة مع المعالجات متعددة عن طريق تقسيم السلسلة كما قال لك.

والآن نقول لكم تريد أن تفعل بالضبط مطابقة الحمض النووي. هذه السلاسل هي آلاف حرفا، وأنها متكررة جدا. وهذا يعطينا فرصة لتحسين.

ويقول لتقسيم سلسلة 1000 شار طويلة إلى 5 أزواج من 100،100. سوف رمز تبدو هذه:

isPal(w[0:100],w[-100:]) and isPail(w[101:200], w[-200:-100]) ...

والخ ... في المرة الأولى التي تفعل هذه المباريات، سيكون لديك لمعالجتها. ومع ذلك، يمكنك إضافة جميع نتائج قمت به في أزواج رسم الخرائط جدول هاش إلى القيم المنطقية:

isPal = {("ATTAGC", "CGATTA"): True, ("ATTGCA", "CAGTAA"): False}

وغيرها ... وهذا سوف يأخذ طريقه الكثير من الذاكرة، وإن كان. للأزواج من 100،100، فإن خريطة التجزئة على 2 * 4 ^ 100 عناصر. قل إن كنتم تخزين اثنين فقط التجزئة 32 بت من سلاسل كمفتاح، سوف تحتاج إلى شيء مثل 10 ^ 55 ميغا بايت، والذي أمر مثير للسخرية.

وربما إذا كنت تستخدم سلاسل صغيرة، يمكن أن تكون المشكلة لين العريكة. ثم سيكون لديك hashmap ضخمة، ولكن على الأقل سياق متناظر للدعنا نقول سوف 10X10 أزواج تأخذ O (1)، والتحقق من ذلك إذا كان سلسلة 1000 هي سوف تتخذ سياق متناظر 100 عمليات البحث بدلا من 500 يقارن. انها لا تزال O (N)، على الرغم من ...

نصائح أخرى

والبديل الآخر من الوظيفة الثانية الخاصة بك. نحن لا تحتاج الى الاختيار يساوي الأجزاء اليمنى من المعتاد، وعكس السلاسل.

def palindrome_reverse(s):
  l = len(s) / 2
  return s[:l] == s[l::-1]

ومن الواضح أنك لن تكون قادرة على الحصول على أفضل من O (ن) كفاءة مقارب، منذ يجب فحص كل حرف مرة واحدة على الأقل. يمكنك الحصول على ثوابت المضاعف أفضل، وإن كان.

لخيط واحد، يمكنك الحصول على تسريع استخدام التجمع. كما يمكنك أن تفعل أفضل من خلال دراسة البيانات في قطع أكبر من بايت في المرة الواحدة، ولكن هذا قد يكون صعبا نظرا لاعتبارات المحاذاة. عليك أن تفعل ما هو أفضل لاستخدام SIMD، إذا يمكنك فحص قطع كبيرة مثل 16 بايت في المرة الواحدة.

إذا أردت أن تتم بشكل مواز ذلك، هل يمكن تقسيم السلسلة إلى قطعة N، ويكون i معالج مقارنة [i*n/2, (i+1)*N/2) شريحة مع [L-(i+1)*N/2, L-i*N/2) القطاع.

وليس هناك، ما لم تفعله مباراة غامض. وهو ما ربما تفعل في الحمض النووي (لقد فعلت EST <م> البحث في الحمض النووي مع سميث-الملاح، ولكن من الواضح أنه أصعب بكثير ثم مطابقة لسياق متناظر أو عكس مكملا في تسلسل).

وكلاهما في O (N) لذلك أنا لا أعتقد أن هناك أي مشكلة كفاءة معينة مع أي من هذه الحلول. ربما أنا لست الإبداعية بما فيه الكفاية ولكن لا استطيع ان ارى كيف سيكون من الممكن مقارنة عناصر N في أقل من الخطوات N، لذلك شيء من هذا القبيل O (تسجيل N) هو بالتأكيد ليس من الممكن IMHO.

وربما تساعد Pararellism، لكنه ما زال لا تغيير رتبة كبيرة أوه الخوارزمية منذ وهو ما يعادل تشغيله على جهاز أسرع.

وبمقارنة من مركز هو دائما أكثر كفاءة حيث يمكنك إنقاذ في وقت مبكر من ملكة جمال لكنها alwo يسمح لك أن تفعل البحث سياق متناظر أسرع كحد أقصى، بغض النظر عما إذا كنت تبحث عن نصف قطرها الأقصى أو كل قلب مستو غير متداخلة.

ووparalellization الحقيقي الوحيد هو إذا كان لديك سلاسل مستقلة متعددة لمعالجة. سوف تنقسم الى قطع تضيع الكثير من العمل لكل ملكة جمال وهناك دائما أكثر من ذلك بكثير يخطئ من الزيارات.

ومع بيثون، يمكن الرمز القصير سيكون أسرع لأنه يضع الحمل في أسرع الداخلية من VM (وهناك مخبأ كله، وهذه أمور أخرى)

def ispalin(x):
   return all(x[a]==x[-a-1] for a in xrange(len(x)>>1))

ويمكنك استخدام جدول هاش لوضع الطابع ويكون متغير مكافحة قيمتها يزيد في كل مرة تجد عنصرا لا في الجدول / خريطة. إذا ش تحقق وتجد أن يكون عنصر بالفعل في الجدول تقليل عدد.

For odd lettered string the counter should be back to 1 and for even it should hit 0.I hope this approach is right.

See below the snippet.
s->refers to string
eg: String s="abbcaddc";
Hashtable<Character,Integer> textMap= new Hashtable<Character,Integer>();
        char charA[]= s.toCharArray();
        for(int i=0;i<charA.length;i++)
        {

            if(!textMap.containsKey(charA[i]))
            {   
                textMap.put(charA[i], ++count);

            }
            else
                {
                textMap.put(charA[i],--count);


        }
        if(length%2 !=0)
        {
            if(count == 1)
            System.out.println("(odd case:PALINDROME)");
            else
                System.out.println("(odd case:not palindrome)");
        }
        else if(length%2==0)    
        {
            if(count ==0)
                System.out.println("(even case:palindrome)");
            else
                System.out.println("(even case :not palindrome)");
        }
public class Palindrome{
    private static boolean isPalindrome(String s){
        if(s == null)
            return false;   //unitialized String ? return false
        if(s.isEmpty())     //Empty Strings is a Palindrome 
            return true;
        //we want check characters on opposite sides of the string 
        //and stop in the middle <divide and conquer>
        int left = 0;  //left-most char    
        int right = s.length() - 1; //right-most char

        while(left < right){  //this elegantly handles odd characters string 
            if(s.charAt(left) != s.charAt(right)) //left char must equal 
                return false; //right else its not a palindrome
            left++; //converge left to right 
            right--;//converge right to left 
        }
        return true; // return true if the while doesn't exit 
    }
}

وعلى الرغم من أننا نقوم ن / 2 حساباتها لا يزال O (ن) وهذا يمكن أن يتم أيضا استخدام المواضيع، ولكن حسابات الحصول على الفوضى، وأفضل لتجنب ذلك. هذا لا اختبار للأحرف خاصة، وهي قضية حساسة. لدي التعليمات البرمجية التي تقوم به، ولكن هذا الرمز يمكن تعديلها للتعامل مع هذا بسهولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top