2016-10-05 17 views
1

ヒープデータ構造に関する質問があります。ヒープデータ構造の実装の迅速化

私は3つの公開機能を持っています。 正しい関数shiftUpshiftDownを作成できません。

shiftUpに私は、ヒープ内の要素を比較し、交換してみてくださいその

これは私のコードの実装です:

class Heap { 
    var heap: [Int] 
    init(array: [Int]) { 
     self.heap = array 
    } 

    var findMax: Int { return heap.first! } 

    private var count: Int {return heap.count} 

    private func floor() -> Int { 
     let floor = log2(Double(heap.count)) 
     return Int(floor) 
    } 

    private func indexOf(element: Int) -> Int { 
     return heap.index(of: element)! 
    } 

    private func parentIndex(index: Int) -> Int { 
     return floor()*(index-1/2) 
    } 

    private func leftChildIndex(index: Int) -> Int { 
     return 2*index+1 
    } 

    private func rightChildIndex(index: Int) -> Int { 
     return 2*index+2 
    } 

    private func swapIfNeed(first: Int,second: Int) { 
      swap(&heap[indexOf(element: first)] , &heap[indexOf(element: second)]) 
    } 

    func shiftDown(index: Int) { 
     let parent = heap[parentIndex(index: index)] 
     let leftChild = heap[leftChildIndex(index: index)] 
     let rightChild = heap[rightChildIndex(index: index)] 
     if parent <= leftChild { 
      swapIfNeed(first: parent, second: leftChild) 
      shiftDown(index: index+1) 
     } else if parent <= rightChild { 
      swapIfNeed(first: parent, second: rightChild) 
      shiftDown(index: index+1) 
     } 
    } 


    private func shiftUp() {} 
    func removeMax() { 

    } 
    func addElement(element: Int) {} 
} 
+1

スウィフトにヒープDSの私の実装を見つけてください。あなたの質問は明確ではありません。あなたは何の問題を抱えていますか?そして、あなたは最後の文章を完成させませんでした:* "私はヒープの要素を比較しようとし、それらの要素を交換しようとします。 – rmaddy

+0

@rmaddy私はfunc shiftDownがどのように動作しなければならないかを理解しています – DmitrievichR

+0

parentIndexメソッド 'return floor()*(index-1/2)'では何が行われますか? –

答えて

0

4.

struct Heap<T: Comparable>{ 
private var heap = [T]() 

mutating func insert(element: T){ 
heap.append(element) 
var index = heap.count - 1 
heapify(childIndex: index) 
} 

mutating func heapify(childIndex: Int){ 
    var parentIndex = (childIndex - 1)/2 
    if parentIndex >= 0 { 
     if heap[parentIndex] < heap[childIndex] { 
      var tempElement = heap[parentIndex] 
      heap[parentIndex] = heap[childIndex] 
      heap[childIndex] = tempElement 
      heapify(childIndex: parentIndex) 
     }else{ 
      print("Created valid heap") 
     } 
    }else{ 
     print("No parent") 
} 
} 
} 
関連する問題