คำถามติดแท็ก arrays

โครงสร้างข้อมูลการเข้าถึงโดยสุ่มตามลำดับซึ่งโดยปกติขนาดจะไม่สามารถเปลี่ยนแปลงได้หลังการสร้าง

3
อัลกอริธึมแบบแทนที่สำหรับการแทรกอาร์เรย์
คุณได้รับองค์ประกอบมากมาย2n2n2n a1,a2,…,an,b1,b2,…bna1,a2,…,an,b1,b2,…bna_1, a_2, \dots, a_n, b_1, b_2, \dots b_n ภารกิจคือการสอดแทรกอาร์เรย์โดยใช้อัลกอริทึมแบบแทนที่ที่อาร์เรย์ผลลัพธ์จะมีลักษณะดังนี้ b1,a1,b2,a2,…,bn,anb1,a1,b2,a2,…,bn,anb_1, a_1, b_2, a_2, \dots , b_n, a_n หากความต้องการในสถานที่ไม่มีเราสามารถสร้างอาร์เรย์และองค์ประกอบการคัดลอกใหม่ที่ให้อัลกอริทึมเวลาO(n)O(n)\mathcal{O}(n) ด้วยความต้องการในสถานที่แบ่งและพิชิตอัลกอริทึมกระแทกขึ้นขั้นตอนวิธีการที่จะเป็นlog)θ(nlogn)θ(nlog⁡n)\theta(n \log n) ดังนั้นคำถามคือ: มีอัลกอริธึมเวลาซึ่งอยู่ในสถานที่ด้วยหรือไม่?O(n)O(n)\mathcal{O}(n) (หมายเหตุ: คุณสามารถสันนิษฐานได้ว่ารูปแบบ WORD RAM ราคาเท่ากันดังนั้นจึงแปลเป็นจำกัด พื้นที่)O(1)O(1)\mathcal{O}(1)

6
การรักษาความลับของสตริงในซอร์สโค้ด (เปิด)
ฉันได้พัฒนาแอพสำหรับ Android และตั้งใจที่จะเผยแพร่มันด้วย GPL - ฉันต้องการให้มันเป็นโอเพนซอร์ส อย่างไรก็ตามลักษณะของแอปพลิเคชั่น (เกม) คือมันจะถามปริศนาและมีคำตอบที่เข้ารหัสลงในทรัพยากรสตริง ฉันไม่สามารถเผยแพร่คำตอบได้! ฉันได้รับคำสั่งให้ดูที่การเก็บรหัสผ่านอย่างปลอดภัย - แต่ฉันไม่พบสิ่งที่เหมาะสม เป็นไปได้ไหมที่จะเผยแพร่ซอร์สโค้ดของฉันด้วยอาร์เรย์สตริงที่ซ่อนเข้ารหัสหรือถูกบดบัง บางทีการอ่านคำตอบจากฐานข้อมูลออนไลน์ ปรับปรุง โซลูชันของ Yuval Filmus ด้านล่างใช้งานได้ เมื่อฉันอ่านครั้งแรกฉันยังไม่แน่ใจว่าจะทำอย่างไร ฉันพบโซลูชันบางอย่างสำหรับตัวเลือกที่สอง: การจัดเก็บโซลูชันแฮชในแหล่งที่มาและคำนวณแฮชทุกครั้งที่ผู้ใช้คาดเดา การทำเช่นนี้ใน JavaScript มีห้องสมุดการเข้ารหัสลับ js ที่http://code.google.com/p/crypto-js/ สำหรับ Android ให้ใช้ฟังก์ชันMessageDigest มีแอปพลิเคชัน (บน fdroid / github) เรียกว่าHashPassซึ่งทำสิ่งนี้
50 arrays  security 

4
วิธีการวัด“ การเรียงลำดับ”
ฉันสงสัยว่ามีวิธีมาตรฐานในการวัด "sortness" ของอาร์เรย์หรือไม่? อาเรย์ที่มีจำนวนค่ามัธยฐานของค่าการรุกรานที่เป็นไปได้จะถือว่าไม่ได้เรียงลำดับสูงสุดหรือไม่ โดยที่ฉันหมายความว่ามันเป็นพื้นเท่าที่จะทำได้จากการเรียงลำดับหรือเรียงกลับกัน

5
การเพิ่มองค์ประกอบให้กับอาร์เรย์ที่เรียงลำดับ
อะไรจะเป็นวิธีที่เร็วที่สุดในการทำสิ่งนี้ (จากมุมมองอัลกอริทึมเช่นเดียวกับเรื่องจริง) ฉันกำลังคิดอะไรบางอย่างตามบรรทัดต่อไปนี้ ฉันสามารถเพิ่มในตอนท้ายของอาร์เรย์แล้วใช้ bubbleort เนื่องจากมีกรณีที่ดีที่สุด (เรียงลำดับทั้งหมดตอนเริ่มต้น) ที่อยู่ใกล้กับนี้และมีเวลาทำงานเชิงเส้น (ในกรณีที่ดีที่สุด) ในทางกลับกันถ้าฉันรู้ว่าฉันเริ่มต้นด้วยอาร์เรย์ที่เรียงลำดับฉันสามารถใช้การค้นหาแบบไบนารีเพื่อค้นหาจุดแทรกสำหรับองค์ประกอบที่กำหนด ลางสังหรณ์ของฉันคือวิธีที่สองเกือบจะดีที่สุด แต่อยากรู้ว่ามีอะไรเกิดขึ้นบ้าง วิธีนี้ทำได้ดีที่สุด?

7
องค์ประกอบหนึ่งที่แตกต่างกันในสองอาร์เรย์ วิธีการค้นหาอย่างมีประสิทธิภาพ?
ฉันกำลังเตรียมการสัมภาษณ์การเขียนโปรแกรมและฉันไม่สามารถหาวิธีที่มีประสิทธิภาพที่สุดในการแก้ปัญหานี้ได้ สมมติว่าเรามีสองอาร์เรย์ประกอบด้วยตัวเลขที่ไม่เรียงกัน Array 2 มีหมายเลขที่ Array 1 ไม่มี ทั้งสองอาร์เรย์มีหมายเลขที่ตั้งแบบสุ่มไม่จำเป็นต้องอยู่ในลำดับเดียวกันหรือในดัชนีเดียวกัน ตัวอย่างเช่น: Array 1 [78,11, 143, 84, 77, 1, 26, 35 .... n] Array 2 [11,84, 35, 25, 77, 78, 26, 143 ... 21 ... n + 1] อัลกอริทึมที่เร็วที่สุดสำหรับการค้นหาหมายเลขที่แตกต่างคืออะไร? เวลาทำงานคืออะไร ในตัวอย่างนี้จำนวนที่เราจะค้นหาคือ 21 ความคิดของฉันคือการทำงานผ่าน Array 1 และลบค่านั้นออกจากอาร์เรย์ 2 ซ้ำแล้วซ้ำอีกจนกว่าคุณจะเสร็จสิ้น นี่ควรจะเป็นเวลาประมาณใช่ไหม?O ( n บันทึกn …

3
มีอัลกอริทึมที่ค้นหาการเรียงลำดับขนาดที่สามในเวลาหรือไม่?
คำถามนี้ถูกย้ายจาก Theoretical Computer Science Exchange Exchange เนื่องจากสามารถตอบได้ใน Computer Science Stack Exchange อพยพ 7 ปีที่ผ่านมา ฉันต้องการที่จะพิสูจน์หรือหักล้างการดำรงอยู่ของอัลกอริทึมที่ได้รับอาร์เรย์ของจำนวนเต็มพบสามดัชนีและดังกล่าวว่าและ (หรือพบว่าไม่มีสามเท่า) ในเวลาเชิงเส้นi , j k i &lt; j &lt; k A [ i ] &lt; A [ j ] &lt; A [ k ]AAAฉัน, Ji,ji, jkkkฉัน&lt; j &lt; ki&lt;j&lt;ki < j < kA[i]&lt;A[j]&lt;A[k]A[i]&lt;A[j]&lt;A[k]A[i] < A[j] …

1
มีโครงสร้างข้อมูลที่มีขนาดคงที่และจะผลักองค์ประกอบที่เก่าที่สุด / สุดท้ายออกหากใส่องค์ประกอบใหม่หรือไม่
ฉันกำลังมองหาโครงสร้างข้อมูลที่จะผลักองค์ประกอบที่เก่าที่สุด / สุดท้ายออกหากมีการแทรกองค์ประกอบใหม่ ตัวอย่างเช่นให้Dเป็นตัวแทนของโครงสร้าง Dมี 3 องค์ประกอบของประเภทNumber Dของค่าเริ่มต้นจะเริ่มต้นได้และ1, 23 D = [ 1 , 2 , 3 ]D=[1,2,3]D = [1, 2, 3] หากผู้Numberที่มีค่าที่5ถูกแทรกลงD, 3จะถูกผลักออกไปในขณะที่1และ2จะถูกเลื่อนขวา D = [ 5 , 1 , 2 ]D=[5,1,2]D = [5, 1, 2] สิ่งแรกที่อยู่ในใจคืออาร์เรย์ แต่คำจำกัดความไม่รวมถึงพฤติกรรมการผลัก

1
ประหยัดในการเริ่มต้นอาร์เรย์
ฉันเพิ่งอ่านว่ามันเป็นไปได้ที่จะมีอาร์เรย์ที่ไม่จำเป็นต้องเริ่มต้นคือมันเป็นไปได้ที่จะใช้พวกเขาโดยไม่ต้องใช้เวลาพยายามตั้งสมาชิกแต่ละคนเป็นค่าเริ่มต้น เช่นคุณสามารถเริ่มใช้อาร์เรย์ราวกับว่ามันได้รับการเริ่มต้นโดยค่าเริ่มต้นโดยไม่ต้องเริ่มต้นได้ (ขออภัยฉันจำไม่ได้ว่าอ่านตรงไหน) ตัวอย่างเช่นสาเหตุที่อาจเป็นเรื่องน่าประหลาดใจ: สมมติว่าคุณกำลังพยายามที่จะจำลอง ที่เลวร้ายที่สุดกรณี Hashtable (สำหรับแต่ละแทรก / search / ลบ) ของจำนวนเต็มในช่วง[ 1 , n 2 ]O (1)O(1)\mathcal{O}(1)[ 1 , n2][1,n2][1, n^2] คุณสามารถจัดสรรอาเรย์ที่มีขนาดบิต2บิตและใช้แต่ละบิตเพื่อแสดงการมีอยู่ของจำนวนเต็มใน hashtable หมายเหตุ: หน่วยความจำจัดสรรถือว่าO ( 1 )เวลาn2n2n^2O (1)O(1)\mathcal{O}(1) ตอนนี้ถ้าคุณไม่ได้มีการเริ่มต้นอาร์เรย์นี้ทั้งหมดลำดับใด ๆ ของการพูดดำเนินการเมื่อวัน Hashtable ตอนนี้กรณีที่เลวร้ายO ( n )nnnO (n)O(n)\mathcal{O}(n) ดังนั้นในความเป็นจริงคุณจะต้องมีการนำแฮช "สมบูรณ์แบบ" มาใช้ซึ่งลำดับของการปฏิบัติการใช้พื้นที่Θ ( n 2 )แต่ทำงานในเวลาO ( n ) …

3
ผลรวมที่ใหญ่ที่สุดหารด้วย n
ฉันถามคำถามนี้กับ StackOverflowแต่ฉันคิดว่าที่นี่เป็นสถานที่ที่เหมาะสมกว่า นี่เป็นปัญหาจากหลักสูตรIntroduction to Algorithm : คุณมีอาร์เรย์aaaพร้อมnnnจำนวนเต็มบวก (อาร์เรย์ไม่จำเป็นต้องเรียงหรือองค์ประกอบที่ไม่ซ้ำกัน) แนะนำให้O(n)O(n)O(n)ขั้นตอนวิธีการที่จะหาผลรวมที่ใหญ่ที่สุดขององค์ประกอบที่หารด้วยnnnn ตัวอย่าง: = [ 6 , 1 , 13 , 4 , 9 , 8 , 25 ] , n = 7 คำตอบคือ56 (มีองค์ประกอบ6 , 13 , 4 , 8 , 25 )a=[6,1,13,4,9,8,25],n=7a=[6,1,13,4,9,8,25],n=7a = [6, 1, 13, 4, 9, 8, 25], n …

9
จะหาค่าซ้ำ 5 ในเวลา O (n) ได้อย่างไร
สมมติว่าคุณมีอาร์เรย์ที่มีขนาดที่มีจำนวนเต็มตั้งแต่ถึงโดยรวมโดยมีการซ้ำห้าครั้ง ฉันต้องการที่จะนำเสนอขั้นตอนวิธีการที่สามารถหาตัวเลขที่ซ้ำในเวลา ฉันไม่สามารถคิดในสิ่งใดได้ตลอดชีวิตของฉัน ฉันคิดว่าการเรียงลำดับที่ดีที่สุดจะเป็นหรือไม่ จากนั้นภายในอาร์เรย์จะเป็นส่งผลให้ในlog) อย่างไรก็ตามฉันไม่แน่ใจว่าการเรียงลำดับจะมีความจำเป็นหรือไม่เนื่องจากฉันได้เห็นบางสิ่งที่ยุ่งยากด้วยรายการลิงก์คิวสแต็ก ฯลฯ1 n - 5 O ( n ) O ( n log n ) O ( n ) O ( n 2ล็อกn )n≥6n≥6n \geq 6111n−5n−5n − 5O(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n\log n)O(n)O(n)O(n)O(n2logn)O(n2log⁡n)O(n^2\log n)

6
วิธีการใช้สองกองในหนึ่งแถว?
ฉันต้องการเริ่มด้วยการบอกว่านี่ไม่ใช่คำถามทำการบ้าน ฉันกำลังอ่านรู้เบื้องต้นเกี่ยวกับอัลกอริทึม - ข้อความ CLRS ที่มีชื่อเสียงที่จะกลายเป็นโปรแกรมเมอร์ที่ดีขึ้น ฉันพยายามที่จะแก้ปัญหาและการออกกำลังกายที่ได้รับในหนังสือด้วยตัวเอง ฉันพยายามที่จะแก้ปัญหาการออกกำลังกาย 10.1-2จากบทที่ 10 โครงสร้างข้อมูลพื้นฐานจาก CLRS Second Edition นี่คือสิ่งที่รัฐ: อธิบายวิธีการใช้สองกองในหนึ่งอาร์เรย์[1..n]ในลักษณะที่ไม่สแต็คล้นเว้นแต่จำนวนรวมขององค์ประกอบทั้งในกองด้วยกันคือn การผลักดันการดำเนินงานและ POP ควรทำงานในO (1)เวลา ทางออกที่ฉันเกิดขึ้นจนถึงตอนนี้คือ: ให้อาร์เรย์[1..n]ใช้สองกอง: S1 [1..i]และS2 [i..n] สำหรับการดำเนินการPUSH-S1และPUSH-S2หากสแต็ค 'เต็ม' จากนั้นเริ่มต้นการผลักองค์ประกอบเข้าสู่สแต็กอื่น ๆ (เช่นถ้าสแต็คS1เต็มเมื่อองค์ประกอบใหม่พยายามที่จะผลักดันเข้าไปแล้วผลักองค์ประกอบนั้นเข้าไป stack S2และในทางกลับกัน) ปัญหาของวิธีนี้คือฉันจะไม่สามารถใช้POP-S1หรือPOP-S2ได้อย่างน่าเชื่อถือเนื่องจากไม่มีวิธีการ 'จดจำ' องค์ประกอบใดที่เป็นของสแต็กใด หากองค์ประกอบของสแต็กเป็นคู่(คีย์, ค่า)คีย์คือหมายเลขสแต็กจากนั้นจึงปรากฏองค์ประกอบที่ฉันจะต้องค้นหาในกรณีที่เลวร้ายที่สุดฉันหรือ (ni) ครั้ง - ซึ่งจะเป็นO (n ) (รู้สึกอิสระที่จะถูกต้องฉันหากฉันผิดที่นี่) ซึ่งจะไม่เป็นO (1) ฉันต่อสู้กับคำถามมาระยะหนึ่งแล้ว ฉันกำลังติดตามใช่ไหม? ใครสามารถให้คำแนะนำที่เป็นไปได้สำหรับการแก้ไขปัญหานี้ได้บ้าง โดยทั่วไปแล้วฉันควร …

1
การนับคู่ผกผัน
แอปพลิเคชั่นการแบ่งและพิชิตแบบคลาสสิกคือการแก้ปัญหาต่อไปนี้: รับอาร์เรย์ของที่แตกต่างกัน, องค์ประกอบเทียบเคียงนับจำนวนของคู่ผกผันในอาร์เรย์: คู่เช่นว่าและเจa[1…n]a[1…n]a[1\dots n](i,j)(i,j)(i,j)a[i]&gt;a[j]a[i]&gt;a[j]a[i] \gt a[j]i&lt;ji&lt;ji \lt j วิธีการหนึ่งในการทำเช่นนี้คือผสาน Merge Sort แต่ยังนับจำนวนคู่ผกผันในปัญหาย่อยด้วย ในระหว่างขั้นตอนการผสานเราจะนับจำนวนคู่ผกผันที่ครอบคลุมปัญหาย่อย (สอง) และเพิ่มเข้าไปในการนับของปัญหาย่อย ขณะนี้เป็นสิ่งที่ดีและให้อัลกอริทึมเวลาสิ่งนี้ทำให้เกิดความสับสนO(nlogn)O(nlog⁡n)O(n\log n) หากเรามีข้อ จำกัด เพิ่มเติมที่อาเรย์เป็นแบบอ่านอย่างเดียวเราสามารถทำสำเนาและจัดการกับการคัดลอกหรือใช้โครงสร้างข้อมูลเพิ่มเติมเช่นสถิติการสั่งซื้อแบบต้นไม้ไบนารีที่สมดุลเพื่อทำการนับซึ่งทั้งสองอย่างใช้พื้นที่Θ(n)Θ(n)\Theta(n) คำถามปัจจุบันคือพยายามพื้นที่ให้ดีขึ้นโดยไม่กระทบต่อเวลาใช้งาน กล่าวคือ มีอัลกอริธึมเวลาเพื่อนับจำนวนคู่ผกผันซึ่งทำงานบนอาเรย์แบบอ่านอย่างเดียวและใช้พื้นที่ย่อยเชิงเส้น (เช่น ) หรือไม่O(nlogn)O(nlog⁡n)O(n\log n)o(n)o(n)o(n) สมมติรูปแบบ RAM ค่าใช้จ่ายสม่ำเสมอและองค์ประกอบที่ใช้เวลาพื้นที่และการเปรียบเทียบระหว่างพวกเขาคือ(1)O(1)O(1)O(1)O(1)O(1)O(1) การอ้างอิงจะทำ แต่คำอธิบายจะดีกว่า :-) ฉันพยายามค้นหาเว็บ แต่ไม่พบคำตอบที่เป็นบวก / ลบสำหรับสิ่งนี้ ฉันคิดว่านี่เป็นเพียงความอยากรู้อยากเห็น

7
ทำไมดัชนีอาเรย์เชิงลบจึงสมเหตุสมผล
ฉันเจอประสบการณ์แปลก ๆ ในการเขียนโปรแกรม C พิจารณารหัสนี้: int main(){ int array1[6] = {0, 1, 2, 3, 4, 5}; int array2[6] = {6, 7, 8, 9, 10, 11}; printf("%d\n", array1[-1]); return 0; } เมื่อฉันรวบรวมและเรียกใช้สิ่งนี้ฉันจะไม่ได้รับข้อผิดพลาดหรือคำเตือนใด ๆ ดังที่วิทยากรของฉันกล่าวว่าดัชนีอาร์เรย์-1เข้าถึงตัวแปรอื่น ฉันยังสับสนอยู่ทำไมภาษาโปรแกรมโลกถึงมีความสามารถนี้ ฉันหมายความว่าทำไมอนุญาตให้ดัชนีอาเรย์เชิงลบ

1
ผลรวมที่ปลอดภัยล้น
สมมติว่าฉันกำลังให้สิทธิ์แก่กว้างคงจำนวนเต็ม (เช่นพวกเขาพอดีในการลงทะเบียนของความกว้าง )ดังกล่าวว่าผลรวมของพวกเขายังเหมาะในการลงทะเบียนของความกว้างWw a 1 , a 2 , … a n a 1 + a 2 + ⋯ + a n = S wnnnWwwa1,2, ...na1,a2,…ana_1, a_2, \dots a_na1+ a2+ ⋯ + an= Sa1+a2+⋯+an=Sa_1 + a_2 + \dots + a_n = SWww มันดูเหมือนว่าฉันว่าเราสามารถเปลี่ยนรูปตัวเลขเพื่อเช่นกันว่าผลรวมคำนำหน้ายังเหมาะในการลงทะเบียนของความกว้างWS i = b 1 + b 2 …

1
การนับจำนวนผลรวมจากอาร์เรย์ย่อยที่ต่อเนื่องกันของอาร์เรย์
เราได้รับอาร์เรย์กับทั้งหมดa[1…n]a[1…n]a[1 \ldots n]a[i]&gt;0a[i]&gt;0a[i]>0 ตอนนี้เราต้องการค้นหาจำนวนผลรวมที่แตกต่างจาก subarrays ของมัน (ที่ subarray เป็นช่วงต่อเนื่องของอาร์เรย์คือสำหรับ , ผลรวมคือผลรวมของทั้งหมด องค์ประกอบของ subarray) ตัวอย่างเช่นถ้าแล้วคำตอบคือ 4: เราสามารถสร้าง1,2,3,4a[j…k]a[j…k]a[j\ldots k]j,kj,kj,ka=[1,2,1]a=[1,2,1]a=[1,2,1]1,2,3,41,2,3,4 1,2,3,4 ฉันรู้วิธีการนับจำนวนของจำนวนเงินที่แตกต่างกันในเวลาO(n2)O(n2)O(n^2) ยิ่งกว่านั้นฉันได้ตระหนักว่านี่คล้ายกับปัญหาคลาสสิคที่เราต้องการค้นหาจำนวนสตริงย่อยที่แตกต่างกันของสตริง ฉันกำลังคิดถึงความเป็นไปได้ในการสร้างอาเรย์ต่อท้ายและแก้ไขในลักษณะที่คล้ายกัน (ในเวลา ) แต่ฉันไม่สามารถหาวิธีแก้ไขได้ที่นี่ ตัวอย่างเช่นถ้าเราใช้ส่วนต่อท้ายสำหรับเราจะได้รับ 5 กรณีแทนที่จะเป็นสี่ที่ยอมรับได้ เป็นไปได้ที่จะทำเช่นนี้โดยใช้อาร์เรย์ต่อท้ายหรือฉันคิดผิดทิศทาง?O(n)O(n)O(n)a=[1,2,1]a=[1,2,1]a=[1,2,1] นอกจากนี้ยังมีอีกหนึ่งทิศทางที่ฉันคิดอยู่แบ่งและพิชิต เช่นถ้าฉันแบ่งอาร์เรย์ออกเป็นสองส่วนทุกครั้งจนกว่าจะลดลงเป็นองค์ประกอบเดียว องค์ประกอบเดียวสามารถมีหนึ่งผลรวม ทีนี้ถ้าเรารวมสององค์ประกอบเดียวเข้าด้วยกันมันสามารถทำได้สองวิธี: ถ้าทั้งสองช่วงมีองค์ประกอบเดียวกันเราจะได้รับผลรวม 2 อันที่แตกต่างกันหรือถ้าทั้งสองมีองค์ประกอบต่างกัน แต่ฉันไม่สามารถที่จะพูดถึงเรื่องนี้สำหรับการรวมอาร์เรย์ที่มีความยาวมากกว่า 1 มันเป็นไปได้ไหมที่จะรวมอาร์เรย์ขนาดสองม. เข้ากับคำตอบใน ?O(m)O(m)O(m)

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