เริ่มต้นอาร์เรย์ในเวลาคงที่ที่ตัดจำหน่ายแล้ว - กลวิธีนี้เรียกว่าอะไร?


13

มีโครงสร้างข้อมูลนี้ที่แลกเปลี่ยนประสิทธิภาพของการเข้าถึงอาเรย์กับความต้องการที่จะวนซ้ำมันเมื่อล้างมัน คุณเก็บตัวนับรุ่นกับแต่ละรายการและตัวนับรุ่นสากล การดำเนินการ "ล้าง" เพิ่มตัวนับการสร้าง ในการเข้าถึงแต่ละครั้งคุณจะเปรียบเทียบตัวนับรุ่นเทียบกับระดับโลก หากพวกเขาแตกต่างกันค่าจะถือว่าเป็น "สะอาด"

คำตอบนี้เกิดขึ้นในStack Overflowเมื่อเร็ว ๆ นี้ แต่ฉันจำไม่ได้ว่าเคล็ดลับนี้มีชื่ออย่างเป็นทางการหรือไม่ ทำมัน?

กรณีใช้งานอย่างหนึ่งคืออัลกอริธึมของ Dijkstraหากมีเพียงส่วนย่อยของโหนดที่จะต้องผ่อนคลายและหากต้องทำซ้ำ ๆ


2
เคล็ดลับที่น่าสนใจ แต่มันมีค่าใช้จ่ายค่อนข้าง ดังนั้นฉันจึงสงสัยว่าการใช้งานใดที่มีการล้างอาร์เรย์ดังกล่าวเป็นการดำเนินการทั่วไปที่ราคาจ่าย (คำถามที่จริงใจ!)
โจอาคิมซาวเออร์

@JoachimSauer: แก้ไขแล้ว
krlmlr

ฟังดูมีราคาแพงมากในกรณีทั่วไปสำหรับการใช้หน่วยความจำและค่าใช้จ่ายในการเข้าถึง กรณีการใช้งานสำหรับเทคนิคนี้จะต้องเฉพาะเจาะจงมาก
Martin York

3
@ โจอาคิม: มันใช้เพื่อล้างบัฟเฟอร์อย่างรวดเร็วสำหรับการเรนเดอร์ - ประมาณ พวกเขามี "บิตที่ชัดเจน" ต่อ 64kb หรือบางอย่างเช่นนั้น
DeadMG

3
@ user946850 "ค่าตัดจำหน่าย" หมายความว่าคุณสามารถพิสูจน์ได้ว่าการดำเนินการที่มีราคาแพงเกิดขึ้นได้ไม่มากในภาพรวมที่ไม่ได้มีส่วนร่วมมากกว่า O (1)

คำตอบ:


2

วิธีการดังกล่าวข้างต้นกำหนดให้แต่ละเซลล์สามารถมีจำนวนมากพอที่จะเก็บจำนวนครั้งที่อาเรย์จะต้องเริ่มต้นใหม่ซึ่งเป็นโทษพื้นที่ที่สำคัญ หากช่องมีความสามารถในการถือครองอย่างน้อยหนึ่งค่าที่จะไม่เขียนได้ถูกต้องตามกฎหมายหนึ่งอาจหลีกเลี่ยงการอื่น ๆ (ที่ไม่คงที่) โทษพื้นที่ใดที่ค่าใช้จ่ายของการเพิ่มนั้นO(Wlg(N))โทษเวลาที่Wเป็นจำนวนที่แตกต่างกันช่องอาร์เรย์เขียนระหว่าง การดำเนินการล้างข้อมูลและNเป็นขนาดของอาร์เรย์ ตัวอย่างเช่นสมมติว่าหนึ่งจะเก็บจำนวนเต็มจาก -2,147,483,647 ถึง 2,147,483,647 (แต่ไม่เคย -2,147,483,648) และต้องการให้รายการอาร์เรย์ว่างเปล่าอ่านเป็นศูนย์ เริ่มต้นด้วยการกรอกอาร์เรย์ด้วย -2,147,483,648 (เรียกค่านั้นB) เมื่ออ่านอาเรย์สล็อตสำหรับแอปพลิเคชันให้รายงานค่าBเป็นศูนย์ ก่อนที่จะเขียนสล็อตอาร์เรย์Iตรวจสอบไม่ว่าจะจัดขึ้นBและถ้าเป็นเช่นนั้นและIมีค่ามากกว่าหนึ่งเก็บเป็นศูนย์ในช่วงI/4หลังจากการดำเนินการตรวจสอบที่คล้ายกันสำหรับสถานที่นั้น (และถ้ามันจัดขึ้นB, I/16ฯลฯ )

ในการล้างอาเรย์เริ่มต้นด้วยI0 หรือ 1 ขึ้นอยู่กับฐานอาเรย์ จากนั้นทำซ้ำขั้นตอนต่อไปนี้: หากรายการIถูกBเพิ่มขึ้นIและหากทำเช่นนั้นให้ผลคูณของสี่ให้หารด้วยสี่ (ยุติถ้าการหารให้ผลเป็น 1); ถ้ารายการIไม่ได้เป็นBร้านค้าBที่นั่นและคูณIด้วยสี่ (ถ้าIเริ่มต้นที่ศูนย์คูณด้วยสี่จะปล่อยให้มันเป็นศูนย์ แต่เนื่องจากรายการ 0 จะเป็นที่ว่างเปล่าIจะได้รับเพิ่มขึ้น)

โปรดทราบว่าเราสามารถแทนที่ค่าคงที่ "สี่" ด้านบนด้วยหมายเลขอื่น ๆ โดยทั่วไปแล้วค่าที่มากกว่าจะต้องการการติดแท็กงานน้อย เนื่องจากอาร์เรย์ของสล็อตที่ติดแท็กจะต้องถูกล้างค่าของสามหรือสี่จึงเหมาะสมที่สุด เนื่องจากค่าสี่นั้นใกล้เคียงกับค่าดีที่สุดดีกว่าสองหรือแปดและสะดวกกว่าหมายเลขอื่น ๆ จึงน่าจะเป็นตัวเลือกที่สมเหตุสมผลที่สุด


มีความเพียงพอที่จะมีตัวนับเวอร์ชันที่สามารถรองรับการรีเซ็ตตามลำดับที่เพียงพอก่อนที่เซลล์ทั้งหมดจะได้รับการอัพเดตด้วยค่าใหม่ ในทางปฏิบัติไบต์อาจเพียงพอหรือน้อยกว่าในลูปที่เข้มงวดยิ่งขึ้น
9000

@ 9000: รหัสที่อาศัยพฤติกรรมดังกล่าวมีแนวโน้มที่จะเปราะบางโดยเฉพาะอย่างยิ่งเมื่อมีเหตุผลเพียงอย่างเดียวที่จะใช้วิธีการ 'หลอก' ที่ชัดเจน โดยทั่วไปแล้วจะมีขนาดเล็กและแปรปรวน - คู่ของเงื่อนไขที่สมคบกันเพื่อเพิ่มความเป็นไปได้ที่ไอเท็มอาจถูกใช้ "เคลียร์" แล้วยังคงไม่ถูกแตะต้องเป็นเวลานานโดยพลการ หนึ่งอาจพิจารณาการสแกนอาร์เรย์และร่างกายการล้างช่องเก่า ๆ เมื่อเคาน์เตอร์เป็นไปห่อ แต่ ...
SuperCat

1
... หากค่าการตัดของตัวนับเป็นค่าคงที่จำนวนงานเฉลี่ยสำหรับการดำเนินการเคลียร์อาร์เรย์แต่ละชุดจะเป็น O (N) โดยที่ N เป็นขนาดของอาร์เรย์ ไม่ว่าสิ่งนั้นอาจไม่เป็นประโยชน์ในทางปฏิบัติเนื่องจากการดำเนินการ O (N) ซึ่งถูกเร่งด้วยปัจจัย 65,536 จะยังคงเป็น O (N) แต่จะเร็วกว่า 65,536 เท่า . ในกรณีที่วิธีการเหล่านี้จะมีประโยชน์ก็อาจได้รับประโยชน์จากการใช้โครงสร้างข้อมูลแบบกระจัดกระจายซึ่งอาจใช้พื้นที่ O (AlgN) เพื่อเก็บอาร์เรย์ด้วยอาร์เรย์ขนาด N ที่มีองค์ประกอบที่ไม่ว่างเปล่า
supercat

1

ฉันจะเรียกมันว่า "เซลล์อาร์เรย์ขี้เกียจเริ่มต้นใหม่" แต่ดูเหมือนจะไม่มีชื่อที่กำหนดไว้ (นั่นคือชื่อกำลังใช้งานอย่างกว้างขวาง)

อัลกอริทึมนั้นฉลาด แต่มีความพิเศษและสามารถใช้ได้ในพื้นที่แคบมาก


1

ฉันเชื่อว่ามันเป็นกรณีพิเศษของการบันทึกความจำยกเว้นในกรณีนี้ "บันทึก" "อายุ" โดยนัยกับการเพิ่มขึ้นของตัวนับทั่วโลกในแต่ละครั้ง ฉันเดา "บันทึกความจำย้อนหลัง"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.