2012-11-12 16 views
7

क्या एक निश्चित लंबाई ढेर के लिए सबसे अच्छा डेटा संरचना है (मैं मूल रूप से यह एक कतार कहा जाता है, लेकिन क्या मैं चाहता हूँ एक ढेर है) जहां आइटम सामने से जुड़ जाते हैं, और हर बार एक आइटम जोड़ा जाता है सामने से एक आइटम अंत से हटा दिया गया है? मोर्चे से विभिन्न लंबाई के उप-वर्गों का भी उपयोग किया जाएगा। मैं वैक्टर का उपयोग कर रहा था, अब clojure.lang.PersistentQueue और उंगली के पेड़ के बारे में सोच रहा था।फिक्स्ड लंबाई ढेर संरचना

संपादित करें, स्पष्ट करने के लिए, की तरह कुछ:

> (def q (queue [1 2 3 4])) 
[1 2 3 4] 
> (push q 9 8 7) 
[7 8 9 1] 
> (peek (push q 9 8 7)) 
7 

EDIT2: आपके सभी सवालों के जवाब अब तक, इस मूल बातें करने के लिए वापस जा रहा और Clojure की खुशी पढ़ने में एक अभ्यास में बदल गया है, उदाहरण के लिए सीखने के लिए धन्यवाद कि subvec की subvec पहले subvec के वेक्टर के लिए एक संदर्भ को बरकरार रखे हुए है, जबकि तरह (vec (विपक्ष एक्स (कुछ subvec ... होगा अगर बार-बार इस्तेमाल सभी मध्यवर्ती subvecs के लिए संदर्भ अर्जित करते हैं। इस के प्रकाश में, कैसे एक वेक्टर के लिए धक्का के इस कार्यान्वयन के बारे में आधारित कतार?:

(defn push [v i n] (if (>= (count v) n) (conj (subvec v 1 n) i) (conj v i))) 

फिर परिणामी वेक्टर rseq जो मेरा मानना ​​है कि वैक्टर के साथ तेज है के माध्यम से पहुँचा जा सकता है (के अपने प्रयोग के कारण सूची ऑफसेट?)

उत्तर

6
+4

Dangit! मेरी लाइब्रेरी से लिंक करके मेरी एसओ प्रतिष्ठा चोरी? मैं निश्चित रूप से बच्चा हूँ। असल में मैं उत्सुक हूं कि आपको यह कैसे मिला, क्योंकि मैंने इसे बिल्कुल विज्ञापित नहीं किया है और 'क्लोजर रिंग बफर' के लिए Google खोज कुछ भी आसानी से नहीं बदलती है। – amalloy

+0

मुझे इसे किसी बिंदु पर Google में मिला और अब मेरे बुकमार्क्स में है;)। धन्यवाद! – DanLebrero

+1

खेद स्पष्ट करने के लिए, अंगूठी बफर सही हो सकता है अगर अपने आइटम जोड़ा गया था और सामने पर peeked और अंत से निकली। यह एक ही समस्या मैं PersistentQueue के साथ किया था है: संयोजक अंत लेकिन मोर्चे पर झांकना करने के लिए कहते हैं, लेकिन मैं केवल (LIFO) सबसे हाल ही में आइटम के सबसे पुराने आइटम के साथ हटाया जा रहा पहला – Hendekagon

1

पर Amalloy की अंगूठी बफर पर एक नज़र डालें IMO तुम सिर्फ उपयोग कर सकते हैं एक सूची:

(defn create-queue [len] 
    (atom (repeat len nil))) 

(defn push [queue new-items] 
    (let [len (count @queue) 
     len2 (count new-items)] 
    (if (>= len2 len) 
     (let [res (concat (take-last (- len2 len) new-items) 
         @queue)] 
     (reset! queue (take len new-items)) 
     res) 
     (let [res (take-last len2 @queue)] 
     (reset! queue (concat new-items 
           (drop-last len2 @queue))) 
     res)))) 

परीक्षण:

(def q (create-queue 4)) 

(take 4 @q) 
-> (nil nil nil nil) 
(push q [1 2 3]) 
-> (nil nil nil) 
(take 4 @q) 
-> (1 2 3 nil) 
(push q [4 5]) 
-> (3 nil) 
(take 4 @q) 
-> (4 5 1 2) 
(push q [6 7 8 9]) 
-> (4 5 1 2) 
(take 4 @q) 
-> (6 7 8 9) 
(push q [10 11 12 13 15 16]) 
-> (15 16 6 7 8 9) 
(take 4 @q) 
-> (10 11 12 13) 
+0

ठीक है, लेकिन मैं पहले से ही वैक्टर का उपयोग कर रहा था। मुझे – Hendekagon

+0

I पर एक परमाणु की आवश्यकता नहीं दिखाई दे रही है। वैक्टरों के बारे में आपके प्रश्न की आखिरी वाक्य याद आती है :) नहीं, हमें यहां stm की आवश्यकता है। इसके अलावा, थ्रेड सुरक्षित समाधान के लिए हमें परमाणु के बजाय रेफरी चाहिए और सभी काम dosync में करें। – mobyte

+0

हम्म, मैं एक सतत संरचना – Hendekagon

संबंधित मुद्दे