คำถามติดแท็ก data-structures

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

1
การแยกประเภทการปรับแต่ง
ที่ทำงานฉันได้รับมอบหมายให้อนุมานข้อมูลบางประเภทเกี่ยวกับภาษาแบบไดนามิก ฉันเขียนลำดับของข้อความไปยังletนิพจน์ที่ซ้อนกันเช่น: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } เนื่องจากฉันเริ่มต้นจากข้อมูลประเภททั่วไปและพยายามอนุมานประเภทที่เฉพาะเจาะจงมากขึ้นตัวเลือกที่เป็นธรรมชาติคือประเภทการปรับแต่ง ตัวอย่างเช่นตัวดำเนินการตามเงื่อนไขส่งคืนการรวมของประเภทของสาขาที่เป็นจริงและเท็จ …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

2
การแฮชใช้การค้นหาต้นไม้แทนรายการ
ฉันกำลังดิ้นรนกับวัสดุการแฮ็กและการค้นหาแบบไบนารี และฉันอ่านว่าแทนที่จะใช้รายการสำหรับจัดเก็บรายการที่มีค่าแฮชเดียวกันมันเป็นไปได้ที่จะใช้แผนภูมิการค้นหาแบบไบนารี่ และฉันพยายามที่จะเข้าใจว่ากรณีที่เลวร้ายที่สุดและเวลาเฉลี่ยในการดำเนินการสำหรับกรณีใด insert, find และ delete มีคุณค่า กรณีเฉลี่ย พวกเขาปรับปรุงด้วยความเคารพในรายการ?

1
คิวลำดับความสำคัญที่มีทั้งการลดคีย์และการเพิ่มคีย์
Fibonnaci กองสนับสนุนการดำเนินการดังต่อไปนี้: insert(key, data) : เพิ่มองค์ประกอบใหม่ให้กับโครงสร้างข้อมูล find-min() : ส่งกลับตัวชี้ไปยังองค์ประกอบด้วยปุ่มต่ำสุด delete-min() : ลบองค์ประกอบที่มีคีย์ขั้นต่ำ delete(node) : ลบองค์ประกอบที่ชี้ไปตาม node decrease-key(node) : ลดคีย์ขององค์ประกอบที่ชี้ไป node การดำเนินการที่ไม่ลบทั้งหมดคือเวลา (ตัดจำหน่าย) และการดำเนินการลบเป็นเวลาตัดจำหน่ายO ( 1 )O(1)O(1)O ( บันทึกn )O(เข้าสู่ระบบ⁡n)O(\log n) มีการใช้งานของคิวลำดับความสำคัญซึ่งสนับสนุนincrease-key(node)ในเวลา (ตัดจำหน่าย) หรือไม่O ( 1 )O(1)O(1)

1
อะไรคือวิธีกะทัดรัดในการแสดงพาร์ติชั่นของชุด?
มีโครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับการแสดงพาร์ทิชันที่ตั้งอยู่ โครงสร้างข้อมูลเหล่านี้มีความซับซ้อนในช่วงเวลาที่เหมาะสมสำหรับการดำเนินการเช่น Union และ Find แต่ไม่ได้มีประสิทธิภาพด้านพื้นที่โดยเฉพาะ การใช้พื้นที่อย่างมีประสิทธิภาพในการเป็นตัวแทนของพาร์ติชั่นคืออะไร? นี่คือจุดเริ่มต้นหนึ่งที่เป็นไปได้: ฉันรู้ว่าจำนวนของพาร์ทิชัน ของชุดที่มีNNNองค์ประกอบคือBNBNB_Nที่NNN -th จำนวนเบลล์ ดังนั้นความซับซ้อนของพื้นที่ที่เหมาะสมที่สุดสำหรับการแสดงพาร์ติชันของชุดที่มีองค์ประกอบNNNคือ บิตlog2(BN)log2⁡(BN)\log_2(B_N)ในการค้นหาการนำเสนอดังกล่าวเราสามารถค้นหาการทำแผนที่แบบหนึ่งต่อหนึ่งระหว่าง (ชุดพาร์ติชันของชุดองค์ประกอบNNN ) และ (ชุดจำนวนเต็มจาก111ถึงBNBNB_N ) มีการทำแผนที่ที่มีประสิทธิภาพในการคำนวณหรือไม่? สิ่งที่ผมหมายถึง "มีประสิทธิภาพ" คือว่าผมต้องการแปลงนี้เป็นตัวแทนที่มีขนาดกะทัดรัดจาก / ไปยังง่ายต่อการจัดการตัวแทน (เช่นรายการของรายการก) ในเวลาพหุนามในNNNหรือlog2(BN)log2⁡(BN)\log_2(B_N) )

3
"แผนที่" หมายถึงอะไร
ฉันพบคำศัพท์หลายครั้งในสื่อการเรียนรู้ CS ต่าง ๆ : L2 CS162 (UC Berkeley): I / O ที่แมปหน่วยความจำ L4 CS162 (UC Berkeley): ไฟล์ที่แม็พหน่วยความจำ L24 CS61 (UC Berkeley): “ หน่วยความจำแมป I / O”: การควบคุมอุปกรณ์ / ข้อมูลลงทะเบียนแมปกับพื้นที่ที่อยู่ของ CPU แม้หลังจาก googling "map" ฉันก็ได้รับบทความ Map_ (สูงกว่า order_function)แต่มันก็ไม่ชัดเจนสำหรับฉัน ยิ่งกว่านั้นพยายามเข้าใจความหมายในบริบทของbitmapการอ่านบทความ Wikipedia : อาเรย์บิตคือการแมปจากบางโดเมน (เกือบตลอดช่วงของจำนวนเต็ม) ไปยังค่าในชุด {0, 1} ฉันไม่แน่ใจ แต่ในบริบทข้างต้นมันฟังดูเกี่ยวกับการแปลงข้อมูล หลังจากอ่านหนังสือ CS …

3
โครงสร้างข้อมูลใดจะเก็บช่วงจำนวนเต็มได้อย่างมีประสิทธิภาพ
ฉันต้องการเก็บสะสมจำนวนเต็มในช่วง 0 ถึง 65535 เพื่อที่ฉันจะสามารถทำสิ่งต่อไปนี้ได้อย่างรวดเร็ว: ใส่จำนวนเต็มใหม่ แทรกช่วงของจำนวนเต็มต่อเนื่อง ลบจำนวนเต็ม ลบจำนวนเต็มทั้งหมดด้านล่างเป็นจำนวนเต็ม ทดสอบว่ามีจำนวนเต็มหรือไม่ ข้อมูลของฉันมีคุณสมบัติที่มักจะมีจำนวนเต็มในคอลเลกชัน ตัวอย่างเช่นการรวบรวมอาจ ณ เวลาหนึ่งจะเป็น: { 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 } วิธีที่ง่ายที่สุดคือการใช้ต้นไม้ไบนารีแบบสมดุลเช่น C ++ std :: set อย่างไรก็ตามโดยที่ฉันไม่ได้ใช้ประโยชน์จากความจริงที่ว่าฉันมักจะมีจำนวนของตัวเลข บางทีอาจเป็นการดีกว่าที่จะเก็บสะสมของช่วง? แต่นั่นหมายความว่าช่วงจะต้องสามารถแยกย่อยได้ถ้าจำนวนเต็มที่อยู่ตรงกลางถูกลบออกหรือรวมเข้าด้วยกันถ้าช่องว่างระหว่างสองช่วงเต็ม มีโครงสร้างข้อมูลใดที่มีอยู่ซึ่งเหมาะสำหรับปัญหานี้หรือไม่?

1
ฟังก์ชั่นที่มีศักยภาพไบนารีกองสกัดสูงสุด O (1)
ฉันต้องการความช่วยเหลือในการหาฟังก์ชั่นที่มีศักยภาพสำหรับ heap สูงสุดเพื่อให้แยก max เสร็จสมบูรณ์ในเวลาตัดจำหน่าย ฉันควรเพิ่มว่าฉันไม่มีความเข้าใจในวิธีการที่เป็นไปได้O( 1 )O(1)O(1) ฉันรู้ว่าฟังก์ชั่นการแทรกควร "จ่าย" มากขึ้นเพื่อลดค่าใช้จ่ายในการสกัดและสิ่งนี้จะต้องเกี่ยวกับความสูงของกอง (ถ้าให้ความสูงของกองควร ส่วนแทรกเป็น2 บันทึก( n )หรือ∑ n k = 1 2 บันทึก( k ) )⌊ บันทึก( n ) ⌋⌊เข้าสู่ระบบ⁡(n)⌋ \lfloor \log(n) \rfloor 2 บันทึก( n )2เข้าสู่ระบบ⁡(n)2\log(n)Σnk = 12 บันทึก( k )Σk=1n2เข้าสู่ระบบ⁡(k) \sum_{k=1}^n 2\log(k)

3
การปรับเปลี่ยนอัลกอริธึมของ Dijkstra สำหรับน้ำหนักขอบที่ดึงจากช่วง
สมมติว่าฉันมีกราฟกำกับที่มีน้ำหนักขอบถูกดึงมาจากช่วง[1,…,K][1,…,K][1,\dots, K]โดยที่KKKคงที่ หากฉันพยายามค้นหาเส้นทางที่สั้นที่สุดโดยใช้อัลกอริทึมของ Dijkstraฉันจะแก้ไขอัลกอริทึม / โครงสร้างข้อมูลและปรับปรุงความซับซ้อนของเวลาเป็นO(|V|+|E|)O(|V|+|E|)O(|V|+|E|)อย่างไร

1
พิสูจน์ว่าแผนภูมิการค้นหาแบบไบนารีที่สร้างแบบสุ่มมีความสูงลอการิทึม
คุณจะพิสูจน์ได้อย่างไรว่าความสูงที่คาดหวังของแผนภูมิการค้นหาแบบไบนารีที่สร้างแบบสุ่มด้วยnnnโหนดคือ ? มีหลักฐานใน CLRS รู้เบื้องต้นเกี่ยวกับอัลกอริทึม (บทที่ 12.4) แต่ฉันไม่เข้าใจO(logn)O(log⁡n)O(\log n)

3
ปัญหาฮีป d-ary จาก CLRS
ฉันสับสนในขณะที่แก้ปัญหาต่อไปนี้ (คำถาม 1-3) คำถาม dกอง -ary เป็นเหมือนกองไบนารี แต่ (ยกเว้นที่เป็นไปได้อย่างใดอย่างหนึ่ง) โหนดที่ไม่ใช่ใบมีdเด็กแทนเด็ก 2 คุณจะเป็นตัวแทนของกองd -ary ในอาร์เรย์ได้อย่างไร? ความสูงของคืออะไรdกอง -ary ของnองค์ประกอบในแง่ของnและd ? ให้การใช้งาน EXTRACT-MAX อย่างมีประสิทธิภาพในd -ary max-heap วิเคราะห์เวลาในการทำงานในแง่ของdและn นำ INSERT ไปใช้อย่างมีประสิทธิภาพด้วยd -ary max-heap วิเคราะห์เวลาในการทำงานในแง่ของdและn ให้การนำไปใช้อย่างมีประสิทธิภาพของ INCREASE-KEY ( A , i , k ) ซึ่งทำเครื่องหมายข้อผิดพลาดหากk <A [i] = k จากนั้นอัพเดตโครงสร้างd -ary matrix heap อย่างเหมาะสม วิเคราะห์เวลาในการทำงานในแง่ของdและn …

1
การพิสูจน์ความซับซ้อนของเวลาสำหรับการนำทรีเซ็กเมนต์ของปัญหาผลรวมระยะไกล
ผมเข้าใจว่าต้นไม้ส่วนที่สามารถใช้ในการหาผลรวมของอาร์เรย์ย่อยของ และที่สามารถทำในนี้เวลาตามกวดวิชาที่นี่AAAO (บันทึกn )O(log⁡n)\mathcal{O}(\log n) แต่ฉันไม่สามารถพิสูจน์ได้ว่าเวลาสอบถามย่อมเป็นn) ลิงค์นี้ (และอื่น ๆ อีกมากมาย) บอกว่าเราสามารถพิสูจน์ได้ว่าในแต่ละระดับจำนวนสูงสุดของโหนดประมวลผลเป็นและอื่น ๆn)O (บันทึกn )O(เข้าสู่ระบบ⁡n)\mathcal{O}(\log n)444O (4บันทึกn ) = O ( บันทึกn )O(4เข้าสู่ระบบ⁡n)=O(เข้าสู่ระบบ⁡n)\mathcal{O}(4 \log n) = \mathcal{O}(\log n) แต่เราจะพิสูจน์เรื่องนี้ได้อย่างไรโดยความขัดแย้ง? และถ้าเป็นเช่นนั้นถ้าเราจะใช้เซกเมนต์ต้นไม้เพื่อหาผลรวมของอาร์เรย์มิติที่สูงขึ้นการพิสูจน์จะขยายออกไปได้อย่างไร? ตัวอย่างเช่นฉันสามารถคิดถึงการหาผลรวมย่อยของเมทริกซ์ย่อยโดยแบ่งเมทริกซ์ดั้งเดิมออกเป็น 4 ส่วน (คล้ายกับช่วงเวลาแบ่งครึ่งในอาร์เรย์เชิงเส้น) สร้างต้นไม้เซ็กเมนต์ Quadrant แต่หลักฐานพิสูจน์ฉัน

1
การปรับปรุงช่วง + แบบสอบถามช่วงที่มีต้นไม้ที่จัดทำดัชนีไบนารี
ฉันพยายามที่จะเข้าใจว่าต้นไม้ดัชนีแบบไบนารี (ต้นไม้ fenwick) สามารถแก้ไขได้เพื่อจัดการแบบสอบถามทั้งช่วงและการปรับปรุงช่วง ฉันพบแหล่งข้อมูลต่อไปนี้: http://kartikkukreja.wordpress.com/2013/12/2/range-updates-with-bit-fenwick-tree/ http://programmingcontests.quora.com/Tutorial-Range-Updates-in-Fenwick http : //apps.topcoder.com/forums/ โมดูล = Thread & threadid = 756271 & start = 0 & MC = 4 # 1579597 แต่แม้หลังจากอ่านทั้งหมดฉันก็ไม่สามารถเข้าใจได้ว่าจุดประสงค์ของต้นไม้ดัชนีไบนารีตัวที่สองคืออะไรหรือทำอะไร มีคนช่วยอธิบายให้ฉันฟังหน่อยได้ไหมว่าต้นไม้แบบดัชนีแบบไบนารีถูกแก้ไขเพื่อจัดการสิ่งเหล่านี้อย่างไร

3
คือความสูงต่ำสุดของไบนารีต้นไม้ทำไม ?
ในคลาส Java ของฉันเรากำลังเรียนรู้เกี่ยวกับความซับซ้อนของคอลเลกชันประเภทต่างๆ ในไม่ช้าเราจะคุยเรื่องต้นไม้ไบนารีซึ่งฉันอ่านมาแล้ว หนังสือระบุว่าความสูงขั้นต่ำของต้นไม้ไบนารีคือแต่ไม่มีคำอธิบายเพิ่มเติมlog2(n+1)−1log2⁡(n+1)−1\log_2(n+1) - 1 มีคนอธิบายได้ไหม

1
ฉันจะสร้างรายการขอบที่เชื่อมต่อเป็นสองเท่าได้อย่างไรเมื่อได้รับชุดของส่วนของเส้น
สำหรับระนาบกราฟกราฟที่กำหนดฝังอยู่ในระนาบกำหนดโดยชุดของส่วนของบรรทัดแต่ละเซกแสดงด้วยจุดปลาย\} สร้างโครงสร้างข้อมูล DCEL สำหรับส่วนภาพถ่ายอธิบายขั้นตอนวิธีพิสูจน์ความถูกต้องและแสดงความซับซ้อนG(V,E)G(V,E)G(V,E)E={e1,...,em}E={e1,...,em}E= \left \{ e_1,...,e_m \right \} eieie_i{Li,Ri}{Li,Ri}\left \{ L_i,R_i \right \} ตามคำอธิบายนี้ของโครงสร้างข้อมูล DCELมีการเชื่อมต่อมากมายระหว่างวัตถุต่าง ๆ (เช่นจุดยอด, ขอบและใบหน้า) ของ DCEL ดังนั้น DCEL ดูเหมือนจะสร้างและบำรุงรักษาได้ยาก คุณรู้จักอัลกอริธึมที่มีประสิทธิภาพซึ่งสามารถใช้สร้างโครงสร้างข้อมูล DCEL ได้หรือไม่?

1
เมื่อใช้เป็นสแต็กการโทรสปาเก็ตตี้ที่ไม่มีขยะจะกลายเป็น DAG หรือไม่?
ฉันกำลังมองหาเทคนิคการใช้งานสำหรับภาษาการเขียนโปรแกรมและเมื่อเร็ว ๆ นี้ได้พบกับสปาเก็ตตี้สแต็คซึ่งน่าจะเหมาะสำหรับรูปแบบการส่งต่อที่ต่อเนื่อง (ให้ใช้ใน Scheme และ SML / NJ ) เพื่อให้ง่ายขึ้นลองพิจารณากระบวนการแบบเธรดเดี่ยวสำหรับคำถามนี้เท่านั้น อย่างไรก็ตามฉันรู้สึกสับสนเล็กน้อยกับ แผนภาพบน Wikipedia (และที่อื่น ๆ ) โดยเฉพาะฉันไม่เข้าใจว่าสถานการณ์ดังกล่าวสามารถเกิดขึ้นได้อย่างไร ฉันสามารถจินตนาการได้ว่ากิ่งที่เป็นสีเทานั้นไม่สามารถเข้าถึงได้และควรเก็บขยะ ในอีกทางหนึ่งด้วยความเข้าใจที่คลุมเครือของฉันเกี่ยวกับวิธีการใช้ CPS โดยใช้กองสปาเก็ตตี้ฉันไม่สามารถจินตนาการได้ว่าคุณจะได้รับการวนซ้ำในโครงสร้างนั้นได้อย่างไร ฉันต้องสรุปว่าแทนที่จะเป็น "แผนผังต้นกำเนิดของพ่อแม่" มันเป็นกราฟวงจรที่กำกับโดยมีแหล่งที่ไม่ใช่ขยะมากมายเช่นเดียวกับที่มีเธรดและมีจำนวนมากเท่าที่จะมี "จุดออก" แต่ความเข้าใจของฉันเกี่ยวกับการใช้งานนี้ค่อนข้างคลุมเครือดังนั้นฉันคิดว่าฉันอาจจะพลาดอะไรบางอย่างไป ฉันหวังว่าใครบางคนสามารถสอนฉันที่นี่ใน "spaghetti call stacks" ซึ่งฉันหมายถึงโครงสร้างข้อมูลที่ใช้ใน Scheme และ / หรือ SML / NJ เพื่อนำกระบวนการ CPS ไปใช้ รับสายสปาเก็ตตี้ดังต่อไปนี้: [exit point] <-- ... <-- [frame A] …

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