ढूँढना है कि क्या 2 BST सरणियों का प्रतिनिधित्व करती isomorphic हैं या नहीं

वोट
0

1) को देखते हुए 2, एक पूरा द्विआधारी पेड़ (स्तर द्वारा स्तर) के तत्वों से युक्त वास्तव में एक पेड़ (एक सरणी में केवल कर स्वैप तक यानी) के पुनर्निर्माण के बिना सरणियों, मैं कैसे जान सकता हूँ कि उन 2 सरणियों isomorphic है या नहीं कर रहे हैं?

2) एक बेहतर समाधान एक isomorphic पेड़ रूपों अगर एक बाइनरी खोजें ट्री।

अद्यतन जैसे

     5 
    / \
    4  7
   /\  /\
  2  3 6 8

के रूप में सरणी में दर्शाया जा सकता है 5 4 7 2 3 6 8

Isomorphic पेड़ पेड़ जो नोड्स के बारे में रोटेशन से एक दूसरे के लिए परिवर्तित किया जा सकता हैं

     5 
    / \
    4  7
   /\  /\
  2  3 6 8



     5 
    / \
    4  7
   /\  /\
  3  2 6 8



     5 
    / \
    4  7
   /\  /\
  3  2 8 6



     5 
    / \
    7  4
   /\  /\
  8  6 3 2
07/11/2011 को 19:30
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
2

आप एक साथ उन दोनों पर एक में आदेश पेड़ की पैदल दूरी पर है और यह देखना होगा कि तत्व एक ही कर रहे हैं हो सकता है।

07/11/2011 को 20:24
का स्रोत उपयोगकर्ता

वोट
0

भाग लेते हुए (2) पहले, नोड्स की अदला-बदली जोड़े - और उनके वंश - प्रत्येक स्तर पर, के रूप में आवश्यक हर एक पेड़ एक द्विआधारी खोज वृक्ष में बाईं नोड्स <= सही नोड्स के साथ चालू करने के लिए,। यह समय लेने के लिए एन लॉग इन करें n होगा। एक बार जब आप इस किया है, यदि आप एक द्विआधारी खोज वृक्ष और एक द्विआधारी खोज वृक्ष के साथ एक पेड़ isomorphic था, अब आप दो द्विआधारी खोज के पेड़ की है। के रूप में yi_H से कहा, इसका मतलब है कि एक में आदेश पेड़ की पैदल दूरी पर उसी क्रम में एक ही तत्व है, तो दोनों के पेड़ isomorphic हैं दिखाएगा। लेकिन एक में आदेश पेड़ की पैदल दूरी पर, एक पेड़ अपने उदाहरणों की तरह एक सरणी में संग्रहीत में, बस सरणी के सभी तत्वों पर जाकर की एक अजीब तरह से है, इसलिए यदि पेड़ isomorphic हैं दो सरणियों समान होने चाहिए।

सबसे आसान तरीका भाग का प्रबंध करने (1) आप अतिरिक्त जगह मिल सकता है है। प्रत्येक पेड़ के निम्नतम स्तर के लिए, प्रत्येक पेड़ के पत्तों के आयोजन के लिए एक हैश तालिका का निर्माण। दो हैश टेबल और बाहर निकलने की तुलना करें अगर वे नोड्स के एक ही सेट पकड़ नहीं है। प्रत्येक पत्ते एक पहचानकर्ता है कि यह पहचान करता है, जहां एक ही पहचानकर्ता अगर पत्ते ही हैं दे। उन पत्तियों के माता-पिता के लिए, एक और हैश तालिका का निर्माण हर माता-पिता पर मूल्यों और उन बच्चों के पहचानकर्ता का उपयोग करते हुए। फिर, जाँच करें कि दो सेट एक ही और बाहर निकलें, तो नहीं हैं। हर माता-पिता एक पहचानकर्ता है कि एक ही है अगर नोड पर मूल्य एक ही है और उसके बच्चों की पहचानकर्ता ही हैं असाइन करें। जब तक आप जड़ तक पहुंचने के लिए आप इस तरह से पेड़ में पर ले जा सकता है। सभी सेट सब तरह से ही कर रहे हैं, तो आप दो isomorphic पेड़ है, और पहचानकर्ता आप प्रत्येक स्तर पर पत्राचार दे। यह (1) भाग से अधिक जटिल है और अतिरिक्त स्थान है, लेकिन केवल रैखिक समय लगता है।

08/11/2011 को 06:26
का स्रोत उपयोगकर्ता

वोट
2

पहली समस्या के लिए:

अंकन के बारे में थोड़ी:

  • t0, T1 - पेड़
  • मूल्य (टी) - संख्या नोड में संग्रहीत
  • बाएं (टी) - बाईं सबट्री
  • सही (टी) - सही सबट्री

t1और t2isomorphic, iff हैं t1और t2खाली हैं,

या value (t1) == value (t2)

तथा

या तो left(t1)isomorphic को है left(t2)और right(t1)isomorphic को है right(t2),

या left(t1)isomorphic को है right(t2)और right(t1)करने के लिए है isomorphicleft(t2)

मान लें पेड़ एक सरणियों में जमा हो जाती है, जैसे कि तत्व 0 जड़ है और और अगर tएक आंतरिक नोड का एक सूचकांक है 2t+1और 2t+2इसके तत्काल बच्चों के सूचकांक, सीधी कार्यान्वयन कर रहे हैं:

#include <stdio.h>

#define N 7

int a[] = { 5, 4, 7, 2, 3, 6, 8 };
int b[] = { 5, 7, 4, 6, 8, 2, 3 };

int
is_isomorphic (int t1, int t2)
{
  if (t1 >= N && t2 >= N)
    return 1;

  if (a [t1] != b [t2])
    return 0;

  return ((is_isomorphic (2*t1 + 1, 2*t2 + 1)
           && is_isomorphic (2*t1 + 2, 2*t2 + 2))
          || (is_isomorphic (2*t1 + 1, 2*t2 + 2)
              && is_isomorphic (2*t1 + 2, 2*t2 + 1)));
}

int main ()
{
  printf ("%s\n", (is_isomorphic (0, 0) ? "yes" : "no"));
  return 0;
}

दूसरी समस्या के लिए, हर कदम पर, हम सबट्री की तुलना aमें छोटे होते जड़ के साथ की सबट्री के लिए bछोटे जड़ के साथ और फिर सबट्री का aबड़ा जड़ के साथ की सबट्री को bबड़ा जड़ के साथ (छोटे और वर्तमान से भी बड़ा की जड़ों aऔर b)।

int
is_isomorphic_bst (int t1, int t2)
{
  if (t1 >= N && t2 >= N)
    return 1;

  if (a [t1] != b [t2])
    return 0;

  int t1l, t1r, t2l, t2r;
  if (a [2*t1 + 1] < a [t1] && a [t1] < a [2*t1 + 2])
    {
      t1l = 2*t1 + 1;
      t1r = 2*t1 + 2;
    }
  else if (a [2*t1 + 1] > a [t1] && a [t1] > a [2*t1 + 2])
    {
      t1l = 2*t1 + 2;
      t1r = 2*t1 + 1;
    }
  else
    return 0;

  if (b [2*t2 + 1] < b [t2] && b [t2] < b [2*t2 + 2])
    {
      t2l = 2*t2 + 1;
      t2r = 2*t2 + 2;
    }
  else if (b [2*t2 + 1] > b [t2] && b [t2] > b [2*t2 + 2])
    {
      t2l = 2*t2 + 2;
      t2r = 2*t2 + 1;
    }
  else
    return 0;

  return is_isomorphic_bst (t1l, t2l) && is_isomorphic_bst (t1r, t2r);
}
08/11/2011 को 15:41
का स्रोत उपयोगकर्ता

वोट
0

BST के लिए:

  1. दोनों सरणियों और मैच के पहले तत्व है। अगर बराबर नहीं तो BST ही नहीं हो रहे हैं।
  2. पहले छोड़ दिया बच्चों का पता लगाएं कि स्कैन किया नहीं किया गया है और मैच (पदों leftPos1 और leftPos2 पर)। तो मिलान नहीं BST ही नहीं हैं।
  3. पहला अधिकार बच्चों का पता लगाएं कि स्कैन किया नहीं किया गया है और मैच (पदों rightPos1 और rightPos2 पर)। तो मिलान नहीं BST ही नहीं हैं।
  4. दोनों बाएँ और दाएँ बच्चों से मेल खाते हैं, तो एक ही आपरेशन उप-सूचियों / सबट्री (leftPos1 और leftPos2 से) और (rightPos1 और rightPos2 से) के दो जोड़ी पर पुनरावर्ती प्रदर्शन करते हैं। इन सबट्री की मूल सरणी के पहले तत्व है।

sublist में छोड़ दिया और सही बच्चों खोज, वहाँ तत्वों पहले से स्कैन कर रहे हैं हो सकता है। ऐसे तत्वों जानने के लिए, उस तत्व है कि यह वर्तमान सबट्री के बच्चों किया जा सकता है की पुष्टि करें। वर्तमान सबट्री माता पिता की बाएं हाथ की ओर पर है, तो, माता पिता के साथ तत्व की तुलना अगर यह दाहिने हाथ की ओर से संबंध रखते हैं तो उस तत्व की उपेक्षा।

#include <stdio.h>

#define BOOL int
#define TRUE 1
#define FALSE 0

BOOL isLeft(int parent, int child) {
    return child <= parent;
}

BOOL isRight(int parent, int child) {
    return child > parent;
}

BOOL isBelongToChild(int parent, int child, int value) {
    if (isLeft(parent, child) && (isLeft(parent, value))) {
        return TRUE;
    }
    if (isRight(parent, child) && (isRight(parent, value))) {
        return TRUE;
    }
    return FALSE;
}

int getLeftPosition(int * array, int size, int parent, BOOL parentExists) {
    int i;

    int first = *array;
    for (i = 1; i < size; i++) {
        int value = *(array + i);
        if (! isBelongToChild(parent, first, value)) {
            continue;
        }
        if (isLeft(first, value)) {
            return i;
        }
    }
    return -1;
}

int getRightPosition(int * array, int size, int parent, BOOL parentExists) {
    int i;

    int first = *array;
    for (i = 1; i < size; i++) {
        int value = *(array + i);
        if (! isBelongToChild(parent, first, value)) {
            continue;
        }
        if (isRight(first, value)) {
            return i;
        }
    }
    return -1;
}

BOOL areSame(int * array1, int pos1, int * array2, int pos2) {
    if (pos1 == -1 && pos2 == -1) {
        return TRUE;
    } else if (*(array1 + pos1) == *(array2 + pos2)) {
        return TRUE;
    } else {
        return FALSE;
    }
}

BOOL isSameBst(int * array1, int size1, int * array2, int size2, int parent, BOOL parentExists) {
    if (0 == size1 && 0 == size2) {
        return TRUE;
    }
    if (*array1 != *array2) {
        return FALSE;
    }

    int leftPos1 = getLeftPosition(array1, size1, parent, parentExists);
    int leftPos2 = getLeftPosition(array2, size2, parent, parentExists);
    if (! areSame(array1, leftPos1, array2, leftPos2)) {
        return FALSE;
    }
    int rightPos1 = getRightPosition(array1, size1, parent, parentExists);
    int rightPos2 = getRightPosition(array2, size2, parent, parentExists);
    if (! areSame(array1, rightPos1, array2, rightPos2)) {
        return FALSE;
    }

    if (leftPos1 > -1) {
        int result = isSameBst((array1 + leftPos1), size1 - leftPos1, (array2 + leftPos2), size2 - leftPos2, *array1, TRUE);
        if (FALSE == result) {
            return FALSE;
        }
    }
    if (rightPos1 > -1) {
        int result = isSameBst((array1 + rightPos1), size1 - rightPos1, (array2 + rightPos2), size2 - rightPos2, *array1, TRUE);
        if (FALSE == result) {
            return FALSE;
        }
    }
    return TRUE;
}

int main ()
{
    int a[] = { 5, 6, 2, 7, 4 };
    int b[] = { 5, 6, 7, 2, 4 };
    printf ("%s\n", (isSameBst(a, 5, b, 5, 0, FALSE) ? "yes" : "no"));
    return 0;
}
16/03/2013 को 18:30
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more