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

อัลกอริทึมเป็นลำดับขั้นตอนที่กำหนดไว้อย่างดีซึ่งกำหนดวิธีแก้ปัญหาแบบนามธรรมให้กับปัญหา ใช้แท็กนี้เมื่อปัญหาของคุณเกี่ยวข้องกับการออกแบบและวิเคราะห์อัลกอริทึม

5
วิธีการค้นหาชุดสูงสุดขององค์ประกอบของอาร์เรย์เช่นว่าทุกองค์ประกอบในมากกว่าหรือเท่ากับ cardinality ของ ?
ฉันมีปัญหาเกี่ยวกับอัลกอริทึม รับอาร์เรย์ (หรือชุด)ของจำนวนเต็มไม่ติดลบ ค้นหาชุดสูงสุดของซึ่งสำหรับ , a \ geqslant | S | .n S T a ∈ S a ⩾ | S |TTTnnnSSSTTTa∈Sa∈Sa\in Sa ⩾ | S|a⩾|S|a\geqslant |S| ตัวอย่างเช่น: ถ้าTTT = [1, 3, 4, 1, 3, 6] ดังนั้นSSSสามารถเป็น [3, 3, 6] หรือ [3, 4, 6] หรือ [4, 3, 6] ใน = …

2
มีการศึกษาหรือทฤษฎีเบื้องหลังการรวมการค้นหาแบบฐานสองและการค้นหาแบบสอดแทรกหรือไม่?
ฉันเพิ่งอ่านอัลกอริทึมนี้ยังสามารถใช้เป็นอัลกอริทึมการค้นหาแบบไบนารี่ได้หรือไม่ และจำได้ว่าไม่กี่ปีหลังฉันเขียนดัชนี / ค้นหาไฟล์บันทึกเพื่อค้นหารายการบันทึกในไฟล์ข้อความธรรมดาขนาดใหญ่ตามหน้าต่างวันที่ / เวลา ในขณะที่ทำสิ่งนี้ฉันตัดสินใจลองค้นหาการแก้ไข (ฉันไม่รู้ว่ามันคือสิ่งที่เรียกว่าฉันเองก็ตกหลุมคิดด้วยตัวเอง) จากนั้นด้วยเหตุผลบางอย่างฉันยังคงความคิดของการสลับขั้นตอนการแก้ไขด้วยขั้นตอนการแยกไบนารี: ในขั้นตอนที่ 0 ฉันจะแก้ไขการตัดสินใจเลือกจุดทดสอบแล้วขั้นตอนที่ 1 ฉันจะใช้จุดกึ่งกลางที่แน่นอน ฯลฯ จากนั้นฉันเปรียบเทียบระบบโดยใช้การค้นหาแบบสอดแทรกที่บริสุทธิ์การค้นหาแบบไบนารีที่แท้จริงและความพยายามในการรวมกันของฉัน วิธีการสลับเป็นผู้ชนะที่ชัดเจนทั้งในเวลาและจำนวนการทดสอบที่จำเป็นก่อนที่จะหาชุดของเวลาที่สุ่มเลือก ได้รับแรงบันดาลใจจากคำถามที่เชื่อมโยงฉันเพิ่งทำการค้นหาอย่างรวดเร็วสำหรับ "การค้นหาการแก้ไขแบบสลับและการค้นหาแบบไบนารี" และไม่พบอะไรเลย ฉันได้ลองใช้ "การค้นหาแบบสอดแทรกการแก้ไขแบบป้องกันความเสี่ยง" ตามที่แนะนำในความคิดเห็นของฉันในคำตอบข้อใดข้อหนึ่ง ฉันเจอสิ่งที่รู้หรือไม่? มีเหตุผลทางทฤษฎีใดที่ทำให้ข้อมูลบางประเภทเร็วขึ้น? โดยทั่วไปไฟล์บันทึกจะมีขนาดใหญ่ในเวลานั้น (เช่นข้อความขนาด 1-2 GB ซึ่งอาจค้นหาได้ 10 ล้านแถว) และการแพร่กระจายของวันที่ / เวลานั้นซับซ้อนด้วยการระเบิดของกิจกรรมเวลาสูงสุดทั่วไปและช่วงเวลาที่เงียบสงบ การทดสอบเกณฑ์มาตรฐานของฉันสุ่มตัวอย่างจากการกระจายเวลาเป้าหมายเท่า ๆ กันเพื่อค้นหา

1
ความซับซ้อนที่รู้จักกันเร็วที่สุดสำหรับอัลกอริทึม ILP combinatorial?
ฉันสงสัยว่าอัลกอริทึมที่รู้จักกันดีที่สุดในแง่ของ Big- สัญกรณ์คือการแก้ปัญหาการเขียนโปรแกรมเชิงเส้นจำนวนเต็ม?OOO ฉันรู้ว่าปัญหาคือสมบูรณ์ดังนั้นฉันไม่คาดหวังว่าจะมีพหุนามใด ๆ และฉันรู้ว่ามีฮิวริสติกจำนวนมากและใช้ในการใช้งานจริงเช่น CPLEX แต่ฉันสนใจในความซับซ้อนที่เป็นทางการและเลวร้ายที่สุดของอัลกอริทึมที่แน่นอนNPNPNP ปัญหาที่ไม่สมบูรณ์ของบางตัวมีอัลกอริทึมในเวลาO ( b n p ( n ) )โดยที่1 &lt; b &lt; 2และpเป็นพหุนาม จุดสุดยอดปกชุดอิสระและ 3SAT ตกอยู่ในหมวดหมู่นี้ แต่ทั่วไป SAT และ TSP ไม่ (เท่าที่เรารู้)NPNPNPO(bnp(n))O(bnp(n))O(b^n p(n))1&lt;b&lt;21&lt;b&lt;21 < b < 2ppp สามารถมีคำสั่งใด ๆ เกี่ยวกับการเขียนโปรแกรมจำนวนเต็มหรืออินสแตนซ์ย่อยเฉพาะได้หรือไม่ หากใครมีข้อมูลอ้างอิงสำหรับปัญหาที่เกี่ยวข้องของ Quantifier Free Presburger Arithmetic ฉันก็สนใจเช่นกัน

6
การหาค่า XOR สูงสุดของตัวเลขสองตัวในช่วงเวลาหนึ่ง: เราจะทำได้ดีกว่าสมการกำลังสองหรือไม่?
สมมติว่าเรากำลังได้รับสองหมายเลขและและที่เราต้องการที่จะหาสำหรับL \ le i, \, J \ le Rlllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r อัลกอริทึมnaïveเพียงตรวจสอบคู่ที่เป็นไปได้ทั้งหมด เช่นในทับทิมเรามี: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j &gt; max) max = i ^ j end end end max end ฉันรู้สึกว่าเราสามารถทำได้ดีกว่าสมการกำลังสอง มีอัลกอริทึมที่ดีกว่าสำหรับปัญหานี้หรือไม่?

4
จำเป็นต้องมีการโอนถ่ายสำหรับอัลกอริทึมการเรียงลำดับหรือไม่
เป็นไปได้หรือไม่ที่จะใช้อัลกอริธึมการจัดเรียงที่มีการเปรียบเทียบแบบไม่ใช้สกรรมกริยาและถ้าใช่ทำไมความไวแสงมีการระบุไว้เป็นข้อกำหนดสำหรับการเรียงลำดับการเปรียบเทียบ? พื้นหลัง: อัลกอริทึมการเรียงลำดับโดยทั่วไปเรียงลำดับองค์ประกอบของรายการตามฟังก์ชันตัวเปรียบเทียบ C (x, y) ด้วย C(x,y)=⎧⎩⎨−10+1if x≺yif x∼yif x≻yC(x,y)={−1if x≺y0if x∼y+1if x≻y\begin{array}{ll} C(x,y) = \begin{cases} -1 & {\text{if}}\ x\prec y \\ 0 & {\text{if}}\ x\sim y \\ +1 & {\text{if}}\ x\succ y \\ \end{cases} \end{array} ข้อกำหนดสำหรับเครื่องมือเปรียบเทียบนี้เท่าที่ฉันเข้าใจ: สะท้อนกลับ: ∀x:C(x,x)=0∀x:C(x,x)=0\forall x: C(x,x)=0 antisymmetric: ∀x,y:C(x,y)=−C(y,x)∀x,y:C(x,y)=−C(y,x)\forall x,y: C(x,y) = - C(y,x) สกรรมกริยา: …

3
ความซับซ้อนของปัญหาการยอมรับลูกแมว
นี้ขึ้นมาในขณะที่ผมพยายามที่จะตอบคำถามนี้ได้ที่ สายไฟความยาวลด ฉันจะเรียกสิ่งนี้ว่า "ปัญหาการแต่งงานหลายคน" แต่อินเทอร์เน็ตดังนั้นลูกแมว เย้! สมมติว่าเรามีMMMลูกแมวที่จะต้องนำไปใช้โดยNNNคนM&gt;NM&gt;NM > N N สำหรับแต่ละลูกแมวiiiและแต่ละคนjjjมีค่าใช้จ่ายcijcijc_{ij}เจ เราต้องการลดค่าใช้จ่ายโดยรวมในการรับลูกแมวทั้งหมดที่นำมาใช้ นอกจากนี้ยังมีชุดของข้อ จำกัด : แต่ละคนjjjสามารถที่จะนำมาใช้ไม่เกินujuju_jลูกแมว ปัญหาจะง่ายมากหากไม่มีข้อ จำกัด ลูกแมวแต่ละตัวiiiไปกับบุคคลjjjซึ่งcijcijc_{ij}นั้นน้อยที่สุด ด้วยข้อ จำกัด มีอัลกอริธึมที่มีประสิทธิภาพสำหรับปัญหานี้หรือว่าเป็นปัญหา NP-hard

4
การคำนวณความแตกต่างระหว่างชุดใหญ่สองชุด
ฉันมีจำนวนเต็มและB จำนวนมาก แต่ละชุดมีประมาณหนึ่งล้านรายการและแต่ละรายการเป็นจำนวนเต็มบวกที่มีความยาวสูงสุด 10 หลัก AAABBB อัลกอริทึมที่ดีที่สุดในการคำนวณและB ∖ Aคืออะไร กล่าวอีกนัยหนึ่งฉันจะคำนวณรายการของAที่ไม่มีในBและในทางกลับกันได้อย่างมีประสิทธิภาพได้อย่างไร อะไรคือโครงสร้างข้อมูลที่ดีที่สุดในการเป็นตัวแทนของสองชุดนี้เพื่อให้การดำเนินการเหล่านี้มีประสิทธิภาพA∖BA∖BA\setminus BB∖AB∖AB\setminus AAAABBB วิธีที่ดีที่สุดที่ฉันสามารถทำได้คือเก็บสองชุดนี้เป็นรายการที่เรียงลำดับแล้วเปรียบเทียบทุกองค์ประกอบของกับทุกองค์ประกอบของBในแบบเชิงเส้น เราทำได้ดีกว่านี้ไหมAAABBB

2
เส้นทางที่ไม่ตัดกันสั้นที่สุดสำหรับกราฟที่ฝังอยู่ในระนาบแบบยุคลิด (2D)
อัลกอริธึมอะไรที่คุณจะใช้เพื่อค้นหาเส้นทางที่สั้นที่สุดของกราฟซึ่งฝังอยู่ในระนาบแบบยุคลิดซึ่งเส้นทางนั้นไม่ควรมีจุดตัดด้วยตนเอง (ในการฝัง) ยกตัวอย่างเช่นในกราฟด้านล่างที่คุณต้องการจะไปจากที่ ) โดยปกติอัลกอริทึมอย่างอัลกอริทึมของ Dijkstra จะสร้างลำดับดังนี้:( 0 , 0 ) → ( - 3 , 2 )(0,0)→(-3,2)(0,0) \rightarrow (-3,2) [ ( 0 , 0 ) →3( 0 , 3 ) →2√( 1 , 2 ) →4( - 3 , 2 ) ] = 7 + 2-√.[(0,0)→3(0,3)→2(1,2)→4(-3,2)]=7+2.\left[ (0,0) \stackrel {3}{\rightarrow} …

1
อัลกอริทึม
สมมติว่าเราจะได้รับเลขที่แตกต่างกันเช่นว่าสำหรับบางคงและสำหรับทุกฉันnnna1,a2,…,ana1,a2,…,ana_1, a_2, \dots, a_n0≤ai≤kn0≤ai≤kn0 \le a_i \le knk&gt;0k&gt;0k \gt 0iii เรามีความสนใจในการหาข้อหาทุกคู่ที่เป็นไปได้สรุปa_j ( อนุญาตให้ )Sij=ai+ajSij=ai+ajS_{ij} = a_i + a_ji=ji=ji = j อัลกอริทึมหนึ่งคือการสร้างพหุนามของระดับและคำนวณสแควร์โดยใช้วิธีการแปลงฟูริเยร์และอ่านพลังกับพวกมัน สัมประสิทธิ์ในพหุนามผลลัพธ์ นี่เป็นอัลกอริทึมเวลาP(x)=∑nj=1xajP(x)=∑j=1nxajP(x) = \sum_{j=1}^{n} x^{a_j}≤kn≤kn\le knO(nlogn)O(nlog⁡n)O(n \log n) ฉันมีสองคำถาม: มีอัลกอริทึมซึ่งไม่ได้ใช้ FFT หรือไม่?O(nlogn)O(nlog⁡n)O(n \log n) รู้จักอัลกอริทึมที่ดีกว่า (เช่น ) หรือไม่ (อนุญาต FFT)o(nlogn)o(nlog⁡n)o(n \log n)

1
อัลกอริธึมที่มีประสิทธิภาพสำหรับการเรียกการปิดสกรรมกริยาของกราฟเชิงเส้นกำกับ
ฉันพยายามที่จะแก้ปัญหากราฟ (ไม่ใช่สำหรับการบ้านเพียงเพื่อฝึกทักษะของฉัน) DAG จะถูกกำหนดโดยที่VคือชุดของจุดยอดและEคือขอบ กราฟจะแสดงเป็นรายการถ้อยคำดังนั้นโวลต์เป็นชุดที่มีการเชื่อมต่อทั้งหมดของโวลต์ งานของฉันคือการหาที่จุดสามารถเข้าถึงได้จากแต่ละจุดสุดยอดวี∈ V โซลูชันที่ฉันใช้มีความซับซ้อนของ O ( V 3 )G(V,E)G(V,E)G(V,E)VVVEEEAvAvA_vvvvv∈Vv∈Vv\in VO(V3)O(V3)O(V^3)ด้วยการปิดสกรรมกริยา แต่ฉันอ่านว่าในบล็อกมันสามารถเร็วกว่าแม้ว่ามันจะไม่เปิดเผยก็ตาม ใครช่วยบอกฉันอีกวิธีหนึ่ง (มีความซับซ้อนที่ดีขึ้น) เพื่อแก้ปัญหาการปิดสกรรมกริยาใน DAG?

2
อัลกอรึทึมของ Bellman-Ford - เหตุใดจึงสามารถปรับปรุงขอบให้ล้าสมัยได้?
อัลกอริทึม Bellman ฟอร์ดเป็นตัวกำหนดเส้นทางที่สั้นที่สุดจากแหล่งเพื่อจุดอื่น ๆ ทั้งหมด ในขั้นต้นระยะห่างระหว่างsและจุดอื่น ๆ ทั้งหมดถูกตั้งค่าให้∞ จากนั้นคำนวณเส้นทางที่สั้นที่สุดจากsถึงจุดสุดยอดแต่ละจุด สิ่งนี้ดำเนินต่อไปสำหรับ | V | - 1ซ้ำ คำถามของฉันคือ:ssssss∞∞\inftysss|V|−1|V|−1|V|-1 ทำไมต้องมีซ้ำ|V|−1|V|−1|V|-1 มันจะสำคัญไหมถ้าฉันตรวจสอบขอบตามลำดับอื่น พูดถ้าฉันตรวจสอบขอบ 1,2,3 เป็นครั้งแรก แต่จากนั้นในการทำซ้ำครั้งที่สองฉันตรวจสอบ 2,3,1 MIT Prof. Eric กล่าวว่าคำสั่งไม่สำคัญ แต่สิ่งนี้ทำให้ฉันสับสน: อัลกอริทึมจะอัปเดตโหนดบน edge ไม่ถูกต้องหรือไม่หากค่าของมันขึ้นอยู่กับ edge x 1แต่x 1นั้นได้รับการอัปเดตหลังจากx 2หรือไม่x2x2x_2x1x1x_1x1x1x_1x2x2x_2

2
Set Similarity - คำนวณดัชนี Jaccard โดยไม่มีความซับซ้อนเป็นกำลังสอง
ฉันมีกลุ่มของชุด n ชุดซึ่งฉันต้องการคำนวณค่าของ "ไม่เหมือนใคร" หรือ "ความคล้ายคลึงกัน" ฉันตัดสินดัชนี Jaccardเป็นตัวชี้วัดที่เหมาะสม น่าเสียดายที่ดัชนี Jaccard ทำงานได้ครั้งละสองชุดเท่านั้น ในการคำนวณความคล้ายคลึงกันระหว่างชุดทั้งหมดชุดจะต้องมีการคำนวณตามลำดับ Jaccardnnnn2n2n^2 (ถ้าช่วยได้มักจะอยู่ระหว่าง 10 ถึง 10,000 และแต่ละชุดมีองค์ประกอบโดยเฉลี่ย 500 ชุดในท้ายที่สุดฉันไม่สนใจว่าชุดสองชุดใดที่คล้ายกัน - แต่ฉันสนใจสิ่งที่มีความคล้ายคลึงกันภายใน ของกลุ่มทั้งหมดของชุดคือ (กล่าวอีกนัยหนึ่งคือค่าเฉลี่ย (หรืออย่างน้อยก็ประมาณค่าความถูกต้องที่เพียงพอเพียงพอของดัชนี Jaccard ทั้งหมดในกลุ่ม))nnn สองคำถาม: มีวิธีที่จะใช้ดัชนี Jaccard โดยไม่มีความซับซ้อนหรือไม่?n2n2n^2 มีวิธีที่ดีกว่าในการคำนวณความเหมือน / ไม่เหมือนกันของชุดในกลุ่มของชุดกว่าวิธีที่ฉันแนะนำข้างต้นหรือไม่

2
การจำแนกประเภทของอัลกอริทึมแบบสุ่ม
จากWikipediaเกี่ยวกับอัลกอริทึมแบบสุ่ม เราต้องแยกความแตกต่างระหว่างอัลกอริธึมที่ใช้อินพุตแบบสุ่มเพื่อลดเวลาทำงานที่คาดหวังหรือการใช้หน่วยความจำ แต่มักจะสิ้นสุดด้วยผลลัพธ์ที่ถูกต้องในระยะเวลาที่ จำกัด และ อัลกอริธึมความน่าจะเป็นซึ่งขึ้นอยู่กับอินพุตสุ่ม ของการสร้างผลลัพธ์ที่ไม่ถูกต้อง (อัลกอริทึม Monte Carlo) หรือล้มเหลวในการสร้างผลลัพธ์ (อัลกอริทึม Las Vegas) โดยการส่งสัญญาณความล้มเหลวหรือล้มเหลวในการยุติ ฉันสงสัยว่า " อัลกอริทึมชนิดแรกใช้อินพุตแบบสุ่มเพื่อลดเวลาทำงานหรือการใช้หน่วยความจำที่คาดไว้ แต่จะสิ้นสุดด้วยผลลัพธ์ที่ถูกต้องในระยะเวลาที่ จำกัด หรือไม่ ความแตกต่างระหว่างอัลกอริธึมกับลาสเวกัสซึ่งอาจล้มเหลวในการสร้างผลลัพธ์คืออะไร ถ้าฉันเข้าใจถูกต้องอัลกอริธึมที่น่าจะเป็นและอัลกอริธึมแบบสุ่มไม่ใช่แนวคิดเดียวกัน อัลกอริธึมความน่าจะเป็นเป็นเพียงหนึ่งในอัลกอริธึมแบบสุ่มและอีกประเภทหนึ่งคือการใช้อินพุตแบบสุ่มเพื่อลดเวลาทำงานหรือการใช้หน่วยความจำที่คาดไว้ แต่จะสิ้นสุดด้วยผลลัพธ์ที่ถูกต้องในเวลา จำกัด

3
โครงสร้างข้อมูลที่มีประสิทธิภาพรองรับการแทรกการลบและ MostFrequent
สมมติว่าเรามีชุดDDDและสมาชิกแต่ละคนเป็นคู่ข้อมูลและคีย์ เราต้องการโครงสร้างข้อมูลที่จะสนับสนุนการดำเนินการต่อไปนี้:DDD แทรกเข้า ,(d,k)(d,k)(d,k)DDD ลบสมาชิก (ไม่จำเป็นต้องค้นหาเพื่อค้นหาเช่นชี้ไปที่สมาชิกใน )eeeeeeeeeDDD MostFrequent ซึ่งส่งคืนสมาชิกเช่นนั้นเป็นหนึ่งในคีย์ที่พบบ่อยที่สุดใน (โปรดทราบว่าคีย์ที่บ่อยที่สุดไม่จำเป็นต้องไม่ซ้ำกัน)e∈De∈De \in De.keye.keye.keyDDD การใช้โครงสร้างข้อมูลนี้อย่างมีประสิทธิภาพคืออะไร โซลูชันของฉันคือฮีปสำหรับคีย์และความถี่ที่จัดลำดับความสำคัญด้วยความถี่พร้อมกับตารางแฮชที่ฟังก์ชันแฮชจะแมปสมาชิกที่มีคีย์เดียวกันกับสล็อตเดียวกันในตารางแฮช สิ่งนี้สามารถให้สำหรับการดำเนินการสองครั้งแรกและสำหรับครั้งที่สาม (เวลาที่เลวร้ายที่สุดในการรันกรณี)Θ(lgn)Θ(lg⁡n)\Theta(\lg n)Θ(1)Θ(1)\Theta(1) ฉันสงสัยว่ามีวิธีแก้ปัญหาที่มีประสิทธิภาพมากกว่านี้ไหม (หรือโซลูชันที่เรียบง่ายกว่าที่มีประสิทธิภาพเท่ากันใช่หรือไม่)

4
อัลกอริธึมเชิงเส้นเวลาเป็นอัลกอริทึมการสตรีมมิ่งหรือไม่
ในคำถามนี้เกี่ยวกับการนับผกผันฉันพบกระดาษที่พิสูจน์ขอบเขตล่างของความซับซ้อนของพื้นที่สำหรับอัลกอริทึมการสตรีม (แน่นอน) ทั้งหมด ฉันอ้างว่าขอบเขตนี้รวมถึงอัลกอริธึมเชิงเส้นเวลาทั้งหมด นี่เป็นตัวหนาเล็กน้อยโดยทั่วไปอัลกอริธึมเชิงเส้นเวลาสามารถกระโดดไปตามความประสงค์ (การเข้าถึงแบบสุ่ม) ซึ่งอัลกอริทึมการสตรีมไม่สามารถทำได้ มีการตรวจสอบองค์ประกอบตามลำดับ ฉันสามารถเล่นหลายรอบได้ แต่มีหลายครั้งอย่างต่อเนื่องเท่านั้น ดังนั้นคำถามของฉัน: ทุกขั้นตอนวิธีเชิงเส้นเวลาสามารถแสดงเป็นอัลกอริทึมการสตรีมที่มีการส่งผ่านจำนวนมากตลอดเวลาได้หรือไม่ การเข้าถึงแบบสุ่มดูเหมือนจะป้องกันการก่อสร้าง (ง่าย) ที่พิสูจน์คำตอบในเชิงบวก แต่ฉันก็ไม่สามารถสร้างตัวอย่างที่เคาน์เตอร์ได้เช่นกัน การเข้าถึงแบบสุ่มอาจไม่เป็นปัญหาขึ้นอยู่กับรุ่นของเครื่อง ฉันจะสนใจคำตอบสำหรับรุ่นเหล่านี้: เครื่องทัวริงอินพุตแบน RAM อินพุตเป็นอาร์เรย์ RAM ป้อนข้อมูลเป็นรายการที่เชื่อมโยง

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