सीएलआरएस से डी-एरी हीप समस्या


10

मैं निम्नलिखित समस्या को हल करते समय भ्रमित हो गया (प्रश्न १-३)।

सवाल

एक डी -ढेर ढेर एक बाइनरी हीप की तरह है, लेकिन (एक संभावित अपवाद के साथ) गैर-पत्ती नोड्स में 2 बच्चों के बजाय डी बच्चे हैं।

  1. आप किसी सरणी में d -ary ढेर का प्रतिनिधित्व कैसे करेंगे ?

  2. N और d के संदर्भ में n तत्वों के d -ary ढेर की ऊंचाई कितनी है ?

  3. एक में EXTRACT-मैक्स की एक कुशल कार्यान्वयन दें -ary अधिकतम-ढेर। D और n के संदर्भ में इसके चलने के समय का विश्लेषण करें ।

  4. एक में सम्मिलित करें का एक कुशल कार्यान्वयन दें -ary अधिकतम-ढेर। D और n के संदर्भ में इसके चलने के समय का विश्लेषण करें ।

  5. INCREASE-KEY ( A , i , k ) का एक कुशल कार्यान्वयन दें , जो k <A [i] = k के होने पर त्रुटि को चिह्नित करता है और फिर d -ary मैट्रिक्स हीप संरचना को उचित रूप से अपडेट करता है। D और n के संदर्भ में इसके चलने के समय का विश्लेषण करें ।

मेरा समाधान

  1. एक सरणीA[a1..an]

    root:a1level 1:a2a2+d1level 2:a2+da2+d+d21level k:a2+i=1k1dia2+i=1kdi1

    मेरा अंकन थोड़ा परिष्कृत लगता है। क्या कोई और सरल है?

  2. चलो की ऊंचाई को दर्शाता है -ary ढेर।

    मान लीजिए कि ढेर एक पूरा हो गया है -ary पेड़

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. यह मेरा कार्यान्वयन है:

    EXTRACT-MAX(A)
    1  if A.heapsize < 1
    2      error "heap underflow"
    3  max = A[1]
    4  A[1] = A[A.heapsize]
    5  A.heap-size = A.heap-size - 1
    6  MAX-HEAPIFY(A, 1)
    7  return max
    
    MAX-HEAPIFY(A, i)
    1  assign depthk-children to AUX[1..d]
    2  for k=1 to d
    3      compare A[i] with AUX[k]
    4      if A[i] <= AUX[k]
    5          exchange A[i] with AUX[k]
    6          k = largest
    7  assign AUX[1..d] back to A[depthk-children]
    8  if largest != i
    9      MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
    
    • MAX-HEAPIFY का समय चल रहा है:

      मैं

      TM=d(c8d+(c9+..+c13)d+c14d)
      जहाँ ऊपर i लाइन की लागत को दर्शाता है।ci
    • EXTRACT-MAX:

      TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    क्या यह एक कुशल उपाय है? या मेरे समाधान के भीतर कुछ गड़बड़ है?


मुझे लगता है कि प्रश्न के साथ-साथ स्पष्टीकरण में थोड़ी सी भी गलती है: d-ary हीप की ऊंचाई h = (लॉग [nd - n + 1]) तक आती है - 1 // इसका "-n" नोट करें और नहीं "-1" और h = (log [nd−1+1])− 1इस प्रकार हम ऊंचाई के लिए स्पष्टीकरण से ऊपर नहीं हैं। h = log [nd + 1 + 1] =1 = log [nd] -1 = log [n] हालांकि, फिर भी, पेड़ की ऊंचाई Θ(log(n)).नोट के रूप में लिखी जाती है : लॉग हमेशा d-ary ढेर के लिए आधार d पर होता है ।
सुरभि राजे

जवाबों:


10
  1. आपका समाधान मान्य है और d -ary ढेर की परिभाषा इस प्रकार है । लेकिन जैसा कि आपने बताया कि आपकी धारणा थोड़ी परिष्कृत है।

    आप उन दो निम्नलिखित कार्यों का उपयोग की मूल पुनः प्राप्त करने के सकता है मैं मई के तत्व और जे के मई के बच्चे मैं मई के तत्व।

    d-ary-parent(i)    return (i2)/d+1

    d-ary-child(i,j)    return d(i1)+j+1

    स्पष्ट रूप से । आप उन कार्यों की जाँच कर सकते हैं जो उस जाँच कर रहे हैं1jdd-ary-parent(d-ary-child(i,j))=i

    इसके अलावा आसान देखने के लिए कि द्विआधारी ढेर के विशेष प्रकार है -ary ढेर जहां , यदि आप स्थानापन्न के साथ , तो आप यह है कि वे कार्यों माता पिता, वाम से मेल खाते हैं और दाएं पुस्तक में उल्लेख किया देखेंगे।dd=2d2

  2. यदि मैं आपके उत्तर को सही ढंग से समझता हूं तो आप एक ज्यामितीय प्रगति का उपयोग करते हैं । आपके मामले में आपको , जो स्पष्ट रूप से , जो वास्तव में एक वैध और सही समाधान है। लेकिन निरंतर उतार-चढ़ाव से निपटने के लिए आप लिखना चाह सकते हैं ।h=logd(nd1+1)1logd(nd)1=logd(n)+logd(d)1=logd(n)+11=logd(n)Θ(logd(n))

    इसका कारण यह है कि कुछ ढेर संतुलित नहीं हो सकते हैं, इसलिए उनका सबसे लंबा रास्ता और सबसे छोटा रास्ता कुछ निरंतर भिन्न होता है , इस समस्या को समाप्त करने के लिए संकेतन का उपयोग करके ।cΘ

  3. आपको पाठ्यपुस्तक में दी गई प्रक्रिया को फिर से लागू करने की आवश्यकता नहीं है, लेकिन आपको इसे थोड़ा बदलना होगा, उदाहरण के लिए दिए गए और का उपयोग करके सभी बच्चों को तालिका में असाइन करना। कार्य करता है।AUXd-ary-parentd-ary-child

    चूँकि को परिवर्तित नहीं किया गया था, इसलिए यह चलने के समय पर निर्भर करता है । अपने विश्लेषण में आप अब आप hight और बच्चों की संख्या के लिए बुरी से बुरी हालत समय आनुपातिक का उपयोग करना चाहिए जो प्रत्येक नोड विचार करना चाहिए (जो ज्यादा से ज्यादा है )। एक बार फिर आपका विश्लेषण बहुत सटीक है, अंत में आपको , जिसे निम्न में रूपांतरित किया जा सकता है:EXTRACT-MAXMAX-HEAPIFYO(d logd(n(d1)))

    O(d logd(n(d1)))=O(d(logd(n)+log(d1)))=O(d logd(n)+d logd(d1))

    व्यावहारिक कारणों से हम हमेशा मान सकते हैं कि , इसलिए हम O संकेतन के भाग को खो सकते हैं , फिर हमें । जो मान्य समाधान भी है। लेकिन आश्चर्य नहीं कि आप मास्टर प्रमेय का उपयोग करके फ़ंक्शन रन टाइम का विश्लेषण भी कर सकते हैं , जो यह दिखाएगा कि केवल नहीं है, बल्कि भी है ।dndlogd(d1)O(dlogd(n))MAX-HEAPIFYOΘ

  4. CLRS पुस्तक पहले से ही INSERT प्रक्रिया प्रदान करती है। जो इस तरह दिखता है:

    INSERT(A,key)    A.heap_size=A.heap_size+1    A[A.heap_size]=    INCREASE-KEY(A,A.heap_size,key)

    यह आसान सिद्ध हो सकता है लेकिन सामान्य ज्ञान यह है कि यह समय की जटिलता है । यह इसलिए है क्योंकि ढेर जड़ के लिए सभी तरह से लगाया जा सकता है।O(logd(n))

  5. INSERT की तरह, INCREASE-KEY को भी पाठ्यपुस्तक में इस प्रकार परिभाषित किया गया है:

    INCREASE-KEY(A,i,key)    if key<A[i]        error"new key is smaller then current"    A[i]=key    while i>1 and A[i]>A[d-ary-parent(i)]        A[i]A[d-ary-parent(i)]        i=d-ary-parent(i)

    जटिलता स्पष्ट रूप से (पिछले बिंदु को देखें)।O(logd(n))


धन्यवाद! INCREASE-KEY और INSERT के कार्यान्वयन के बारे में कैसे? मैं इसे लिखने की कोशिश करता हूं, लेकिन इसने MAX-HEAPIFY की दो बार पुनरावर्ती कॉल दी। क्या कोई बेहतर समाधान है? मुझे वेब और विकी
lucasKo

क्या यह बाकी व्यायाम है? यदि ऐसा है तो कृपया अपने प्रश्न को अपडेट करें और मुझे विषय का उत्तर देने में खुशी होगी।
बार्टोज़ प्रेज़ीबल्स्की

मैंने उन सवालों को संपादित पोस्ट पर डाल दिया।
lucasKo

INSERT प्रक्रिया को फिर से लागू करें? आप मतलब है, यह प्रक्रिया है कि ढेर के भीतर आदेश को समायोजित करता है, एक नया तत्व डालने के बाद कॉल करने के लिए नहीं है? मुझे यह नहीं मिला ...
lucasKo

यह विवरण थोड़ा दुर्भाग्यपूर्ण था, स्पष्टीकरण के लिए संपादन देखें।
बार्टोज़ प्रेज़ीबेल्स्की

1

यह पूर्ण उत्तर नहीं है। भाग b) समाधान इसका जैसा कि उपयोगकर्ता 55463 द्वारा इंगित किया गया है (क्योंकि वह टिप्पणी नहीं कर सकता है, लेकिन उत्तर), लेकिन स्पष्टीकरण की कमी के कारण अस्वीकृत । अपवोट उत्तर ने भी गलती से इसे हल कर दिया है। उत्तर अभी भी स्रोत: समस्या 2-2 होगा। D -ary ढेर का विश्लेषण, भाग b)

h=logd[nd1+1]1
= Θ ( लॉग ( एन ) )
1+d+d2+..+dh=ndh+11d1=nh=logd[n(d1)+1]1
h=Θ(logd(n))

-1

दूसरे प्रश्न का उत्तर h = log d (n (d-1) + 1) है - 1 इसलिए, h = log d (nd - n + 1) - 1


4
इसका जवाब क्यों है? बिना किसी स्पष्टीकरण के एक सूत्र वास्तव में किसी की मदद नहीं करता है।
डेविड रिचरबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.