วิทยาศาสตร์คอมพิวเตอร์

ถาม - ตอบสำหรับนักเรียนนักวิจัยและผู้ปฏิบัติงานด้านวิทยาการคอมพิวเตอร์

2
คู่ที่ใกล้ที่สุดของคะแนนระหว่างสองชุดในแบบ 2 มิติ
ฉันมีสองชุดจุดในระนาบ 2 มิติ ฉันต้องการค้นหาจุดที่ใกล้ที่สุดs , tเช่นs ∈ S , t ∈ Tและระยะทางแบบยุคลิดระหว่างs , tมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ สิ่งนี้สามารถทำได้อย่างมีประสิทธิภาพ? สามารถทำได้ในเวลาO ( n log n )โดยที่n = | S | + | T | ?S,TS,TS,Ts,ts,ts,ts∈Ss∈Ss \in St∈Tt∈Tt \in Ts,ts,ts,tO(nlogn)O(nlog⁡n)O(n \log n)n=|S|+|T|n=|S|+|T|n = |S|+|T| ฉันรู้ว่าถ้าฉันให้เป็นหนึ่งเดียวชุดแล้วมันเป็นไปได้ที่จะหาคู่ที่อยู่ใกล้จุดs , s ' ∈ SในO ( n log n )เวลาโดยใช้ขั้นตอนวิธีการหารและพิชิตมาตรฐาน อย่างไรก็ตามอัลกอริทึมนั้นดูเหมือนจะไม่พูดคุยกับกรณีของสองชุดเนื่องจากไม่มีการเชื่อมต่อระหว่างระยะห่างระหว่างจุดที่ใกล้เคียงที่สุดสองจุดภายในหรือเทียบกับระยะห่างระหว่างจุดที่ใกล้เคียงที่สุดทั้งสองชุดSSSs,s′∈Ss,s′∈Ss,s' …

1
เครื่องมือสร้างต้นแบบความหมายภาษาโปรแกรม
มีเครื่องมือใดสำหรับการสร้างต้นแบบ semantics ภาษาการเขียนโปรแกรมและระบบชนิดและยังช่วยให้การตรวจสอบรูปแบบของคุณสมบัติมาตรฐานเช่นความแข็งแรงของประเภท? ฉันถามสิ่งนี้เพราะฉันกำลังอ่านหนังสือเกี่ยวกับAlloyและมีฟังก์ชั่นที่แน่นอนที่ฉันต้องการ แต่สำหรับรุ่นที่แสดงโดยใช้ตรรกะเชิงสัมพันธ์ ฉันรู้เรื่องOttแต่ไม่มีความสามารถในการ "ตรวจสอบแบบจำลอง" เนื่องจากมันมุ่งเน้นไปที่การสร้างรหัสสำหรับระบบผู้ช่วยที่พิสูจน์ได้ การอ้างอิงถึงการมีอยู่ของเครื่องมือดังกล่าวจะดีมาก

4
มันสมเหตุสมผลไหมที่จะมีทั้งแนวคิดของ 'null' และ 'บางที'?
ในขณะที่สร้างไคลเอนต์สำหรับเว็บ APIใน C # ฉันพบปัญหาเกี่ยวกับnullค่าที่มันจะแสดงถึงสองสิ่งที่แตกต่างกัน: ไม่มีอะไรเช่นfooอาจหรือไม่มีbar ไม่รู้จัก : โดยค่าเริ่มต้นการตอบสนองของ API จะรวมเฉพาะชุดย่อยของคุณสมบัติเท่านั้นคุณจะต้องระบุคุณสมบัติเพิ่มเติมที่คุณต้องการ ไม่ทราบดังนั้นจึงหมายความว่าไม่ได้ขอคุณสมบัติจาก API หลังจากการค้นหาบางอย่างฉันพบเกี่ยวกับประเภทอาจ (หรือตัวเลือก) วิธีการใช้งานในภาษาที่ใช้งานได้และวิธีที่ "แก้ปัญหา" การแก้ปัญหาเป็นโมฆะโดยการบังคับให้ผู้ใช้คิดถึงการขาดค่าที่เป็นไปได้ แต่ทั้งหมดของทรัพยากรที่ผมพบพูดคุยเกี่ยวกับการเปลี่ยนnullด้วยบางที ฉันพบว่ามีเหตุผลสามประการที่มีค่าแต่ฉันไม่เข้าใจอย่างเต็มที่และส่วนใหญ่ที่กล่าวถึงในบริบทของ "มันเป็นสิ่งที่ไม่ดี" ตอนนี้ผมสงสัยว่าถ้ามันทำให้รู้สึกที่จะมีทั้งแนวคิดของnullและอาจจะเพื่อเป็นตัวแทนที่ไม่รู้จักและไม่มีอะไรตามลำดับ นี่เป็นตรรกะสามค่าที่ฉันอ่านหรือมีชื่ออื่นหรือไม่? หรือเป็นวิธีที่ตั้งใจจะทำรังในบางทีใน?

1
วิธีแบ่งพาร์ติชั่นให้เป็นเซตย่อยของ disjoint ที่กำหนดภายใต้เงื่อนไขบางประการ?
ฉันกำลังได้รับชุด , จำนวนเต็มและ integers เชิงลบa_ {IJ} ปัญหาของฉันคือการหาsเคล็ดย่อยS_jของ\ {1 \ ldots, k \}ดังกล่าวว่า:A≜{1,…,k}A≜{1,…,k}A\triangleq\{1,\ldots,k\}s⩽ks⩽ks\leqslant kaijaija_{ij}sssSjSjS_j{1,…,k}{1,…,k}\{1,\ldots,k\} ⋃sj=1Sj=A⋃j=1sSj=A\bigcup_{j=1}^s S_j=A ; และ |Sj|⩽aij|Sj|⩽aij|S_j|\leqslant a_{ij}สำหรับi∈Sji∈Sji\in S_jและj=1,…,sj=1,…,sj=1,\ldots,sทั้งหมด วิธีแก้ปัญหานี้ มันยากที่จะหาทางออกที่เป็นไปได้? ฉันคิดว่ามันไม่ใช่เรื่องง่ายที่จะแก้ปัญหาเพราะฉันลองใช้ขั้นตอนบางอย่างที่เริ่มต้นด้วยj∈{1,…,n}j∈{1,…,n}j\in\{1,\ldots,n\}และมอบหมายi∈{1,…,k}i∈{1,…,k}i\in\{1,\ldots,k\}จนกระทั่งจำนวน จากiiiมอบหมายให้jjjมากกว่าaijaija_{ij}สำหรับบางคนที่iiiได้รับมอบหมาย แต่สิ่งนี้ไม่ถูกต้องเพราะฉันเหลือบางiiiที่ไม่สามารถมอบหมายให้jใด ๆjjj(เพราะa_ {ij}ของพวกเขาaijaija_{ij}ซึ่งไม่พอใจ) วิธีเดรัจฉานบังคับเมื่อฉันต้องสร้างเซตย่อยทั้งหมดของAAAและทดสอบแต่ละอันทำงานให้ฉัน ( k=8,n=3k=8,n=3k=8,n=3 ) แต่ไม่มีประสิทธิภาพมาก

3
Downcasting อัตโนมัติโดยการอนุมานประเภท
ในจาวาคุณต้องส่งอย่างชัดเจนเพื่อลดตัวแปร public class Fruit{} // parent class public class Apple extends Fruit{} // child class public static void main(String args[]) { // An implicit upcast Fruit parent = new Apple(); // An explicit downcast to Apple Apple child = (Apple)parent; } มีเหตุผลสำหรับข้อกำหนดนี้นอกเหนือจากข้อเท็จจริงที่ว่า Java ไม่ได้ทำการอนุมานประเภทใด? มี "gotchas" ในการติดตั้ง downcasting อัตโนมัติในภาษาใหม่หรือไม่? ตัวอย่างเช่น …

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

1
'อิสซาเบล' (นักทฤษฎีบท) ได้ชื่อมาอย่างไร?
ชื่อกล่าวมันทั้งหมด แต่ฉันอยากรู้อยากเห็นเพราะไม่ชัดเจนว่านักทฤษฎีบทมาเป็นชื่อ 'Isabelle' มันเป็นชื่อสำหรับคนหรือไม่? ฉันไม่สามารถค้นหาด้วยการค้นหาของ Google ได้

1
เหตุใด NP จึงเป็น EXPTIME
มีวิธีง่าย ๆ ที่จะดูว่าทำไม NP ถึงอยู่ใน EXPTIME ดูเหมือนว่าเป็นเรื่องที่คิดได้ว่าอาจมีปัญหาซึ่งต้องใช้เวลาในการแก้ปัญหาแบบทวีคูณมาก แต่วิธีแก้ปัญหานั้นสามารถตรวจสอบได้ในเวลาพหุนาม

3
เหตุใดนิพจน์ทั่วไปที่นิยามไว้ด้วยการรวมกันเป็นสหภาพการต่อเรียงและการติดดาว?
expresssion ปกติจะถูกกำหนดเป็นซ้ำ aaaสำหรับบางคนคือการแสดงออกปกติa∈Σa∈Σa \in \Sigma εε\varepsilonเป็นนิพจน์ทั่วไป ∅∅\emptysetเป็นนิพจน์ทั่วไป (R1∪R2)(R1∪R2)(R_1 \cup R_2)โดยที่และเป็นนิพจน์ทั่วไปเป็นนิพจน์ปกติR1R1R_1R2R2R_2 (R1∘R2)(R1∘R2)(R_1 \circ R_2)โดยที่และเป็นนิพจน์ทั่วไปคือนิพจน์ทั่วไปR1R1R_1R2R2R_2 (R1)∗(R1)∗(R_1)^*โดยที่เป็นนิพจน์ทั่วไปคือนิพจน์ทั่วไปR1R1R_1 คำจำกัดความนี้นำมาจากหน้า 64 ของ Sipser, Michael ทฤษฎีการคำนวณเบื้องต้นรุ่นที่ 3 เรียนรู้ Cengage, 2012 ตอนนี้ฉันมีคำถามต่อไปนี้ ทำไมคุณไม่นิยามมีintersection, complementหรือreverseการดำเนินงาน? หากเราเปลี่ยนรายการที่ 4 เป็นเราจะได้คำจำกัดความที่เทียบเท่ากันเช่นสำหรับภาษาปกติแต่ละภาษาจะมีนิพจน์ทั่วไปที่ปรับเปลี่ยนและในทางกลับกันR1∩R2R1∩R2R_1 \cap R_2 ฉันรู้ว่าคำจำกัดความนี้สมบูรณ์และกำหนดชัดเจน แต่ทำไมถึงต้องการคำนิยามอื่น ๆ ที่เทียบเท่านิยามที่ชัดเจนและสมบูรณ์

4
ทำไมเราต้องแลกเปลี่ยนนามธรรมเพื่อความรวดเร็ว
ทำไมภาษาระดับสูงถึงไม่สามารถเข้าถึงภาษาระดับต่ำกว่าในแง่ของความเร็วได้? ตัวอย่างภาษาระดับสูง ได้แก่ Python, Haskell และ Java ภาษาระดับต่ำจะยากกว่าที่จะนิยาม แต่สมมติว่า C. การเปรียบเทียบสามารถพบได้ทั่วอินเทอร์เน็ต1และพวกเขาทั้งหมดเห็นด้วยว่า C นั้นเร็วกว่ามากบางครั้งอาจเป็น 10 หรือมากกว่า11^1 อะไรที่ทำให้ประสิทธิภาพแตกต่างกันมากและทำไมภาษาระดับสูงถึงไม่ทัน ตอนแรกฉันเชื่อว่านี่เป็นความผิดพลาดของคอมไพเลอร์และสิ่งต่าง ๆ จะดีขึ้นในอนาคต แต่ภาษาระดับสูงที่ได้รับความนิยมสูงสุดบางภาษาได้ใช้เวลาหลายสิบปีและพวกเขาก็ยังล้าหลังเมื่อพูดถึงความเร็ว พวกเขาไม่สามารถคอมไพล์คล้ายกับแผนผังไวยากรณ์ C แล้วทำตามขั้นตอนเดียวกันที่สร้างรหัสเครื่องได้หรือไม่ หรือบางทีมันเป็นสิ่งที่จะทำอย่างไรกับไวยากรณ์ของตัวเอง? ตัวอย่าง:11^1 เกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์ หน้ามาตรฐานของ Julia

1
จัดทำดัชนีในฐานข้อมูลรูปแบบ - โซลูชันคิวบ์ของ Optimal Rubik ของ Korf
ในฐานะที่เป็นโครงการที่สนุกฉันได้ทำงานเกี่ยวกับการใช้ C # ของ Richard Korf - การค้นหาโซลูชันที่เหมาะสมที่สุดกับ Cube ของ Rubik โดยใช้ฐานข้อมูลรูปแบบ https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf ฉันใช้งานได้จริงฉันแค่พยายามปรับปรุงวิธีแก้ปัญหาของฉัน สิ่งหนึ่งที่ Korf จ้องมองในกระดาษของเขาคือวิธีที่เขาเก็บและจัดทำดัชนีลงในฐานข้อมูลรูปแบบ ฉันคิดว่าเราต้องการใช้ตัวอย่างของลูกบาศก์รูบิคเพื่อสร้างดัชนีเป็นอาร์เรย์ คำถามของฉันเกี่ยวกับวิธีที่ดีที่สุดในการสร้างดัชนีนี้ ทางออกของฉันคือการสร้างแฮชที่สมบูรณ์แบบน้อยที่สุด สิ่งนี้เกี่ยวข้องกับการรักษาคิวบ์ทั้งหมดไว้ในหน่วยความจำจนกว่าฉันจะค้นพบฐานข้อมูลรูปแบบทั้งหมดจากนั้นสร้างแฮชที่สมบูรณ์แบบเพียงเล็กน้อยจากนั้น MPH ใช้เวลาสองสามชั่วโมงในการรันขึ้นอยู่กับขนาดฐานข้อมูลรูปแบบ แต่ฉันต้องทำเพียงครั้งเดียวนับตั้งแต่ฉันบันทึกลงดิสก์ ในท้ายที่สุดฉันสามารถโยนก้อนเองเก็บเฉพาะ MPH ด้วยวิธีนี้ฉันสามารถใช้ลูกบาศก์ของรูบิคแบบสุ่มใช้รูปแบบจากนั้นค้นหาดัชนีอาร์เรย์ใน MPH เพื่อรับความยาวของโซลูชันโดยประมาณ ฉันเชื่อว่า Korf และ Shultz อธิบายวิธีที่ดีกว่าในการกำหนดดัชนีของคิวบ์ในกระดาษ 2548 ของพวกเขาที่เรียกว่า "การค้นหาแบบกว้างขนาดใหญ่ - การค้นหาครั้งแรก" https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf บทความนี้อธิบายถึงอัลกอริทึมในการสร้างดัชนีโดยอ้างอิงจากการเรียงลำดับพจนานุกรมของการเปลี่ยนแปลง โดยทั่วไปคุณสามารถหาการเปลี่ยนแปลง {1, 2, 3} และคิดว่ามันเล็กที่สุดโดยมีดัชนีเป็น 0 {1, 3, 2} …

3
มีหลักฐานว่าคอมพิวเตอร์ควอนตัมมีประสิทธิภาพมากกว่าคอมพิวเตอร์แบบดั้งเดิมหรือไม่?
อัลกอริทึมของแคระแกร็นมักใช้เป็นอาร์กิวเมนต์ มันสามารถแก้ปัญหาการแยกตัวได้เร็วกว่าอัลกอริธึมที่รู้จักสำหรับคอมพิวเตอร์แบบดั้งเดิม ถึงกระนั้นเราก็ไม่มีเครื่องคอมพิวเตอร์คลาสสิกที่พิสูจน์ได้ว่ายังไม่สามารถแยกจำนวนเต็มได้อย่างมีประสิทธิภาพ มีคอมพิวเตอร์ควอนตัมที่แท้จริงใด ๆ ที่พิสูจน์ได้สามารถแก้ปัญหาได้เร็วกว่าคอมพิวเตอร์ทั่วไปหรือไม่?

1
การค้นหาความครอบคลุมขั้นต่ำของเซตย่อยของผลิตภัณฑ์คาร์ทีเซียนที่ จำกัด โดยผลิตภัณฑ์คาร์ทีเซียน
ด้วยเซตย่อยของผลิตภัณฑ์คาร์ทีเซียนของเซต จำกัด สองชุดฉันต้องการค้นหาปกน้อยที่สุดโดยชุดซึ่งเป็นผลิตภัณฑ์คาร์ทีเซียนเองผม× JI×JI \times J ตัวอย่างเช่นเมื่อได้รับผลิตภัณฑ์ระหว่างและ , ฉันอาจสังเกตเห็นชุดย่อยและพยายามคลุมด้วยผลิตภัณฑ์คาร์ทีเซียนจำนวนน้อยที่สุดJ = { 1 , 2 , 3 } { ( A , 2 ) , ( B , 3 ) , ( B , 2 ) }ผม= { A , B , C}I={A,B,C}I=\{A,B,C\}J= { 1 , 2 , 3 }J={1,2,3}J=\{1,2,3\}{ ( …

2
เหตุใดจุดคงที่อย่างน้อย (lfp) จึงมีความสำคัญในการวิเคราะห์โปรแกรม
ฉันพยายามรับภาพรวมเกี่ยวกับความสำคัญของจุดคงที่น้อยที่สุด (lfp) ในการวิเคราะห์โปรแกรม เช่นการตีความเชิงนามธรรมดูเหมือนว่าจะใช้การดำรงอยู่ของ lfp เอกสารการวิจัยจำนวนมากเกี่ยวกับการวิเคราะห์โปรแกรมยังมุ่งเน้นไปที่การหาจุดตายตัวที่น้อยที่สุด โดยเฉพาะอย่างยิ่งบทความในวิกิพีเดีย: ทฤษฎีบท Knaster-Tarskiกล่าวว่า lfp ใช้เพื่อกำหนดความหมายของโปรแกรม ทำไมมันถึงสำคัญ? ตัวอย่างง่ายๆช่วยฉันได้ (ฉันพยายามที่จะได้ภาพใหญ่) แก้ไข ฉันคิดว่าถ้อยคำของฉันไม่ถูกต้อง ฉันไม่ท้าทายความสำคัญของ lfp คำถามที่แน่นอนของฉัน (เริ่มต้น) คือ: การคำนวณ lfp ช่วยในการวิเคราะห์โปรแกรมอย่างไร ยกตัวอย่างเช่นเหตุใดการตีความทางนามธรรมจึงใช้ lfp จะเกิดอะไรขึ้นถ้าไม่มี lfp ในโดเมนนามธรรม? หวังว่าคำถามของฉันจะเป็นรูปธรรมมากขึ้นในตอนนี้

3
อะไรคือความแตกต่างระหว่างประเภทข้อมูลนามธรรมและวัตถุ?
คำตอบ Programmers.SEลักษณะการเขียนเรียงความโดย Cook ( วัตถุที่ไม่ได้ ADTs ) เป็นคำพูด วัตถุทำตัวเหมือนฟังก์ชั่นที่มีลักษณะเหนือค่าของประเภทมากกว่าเป็นพีชคณิต วัตถุใช้นามธรรมกระบวนการแทนที่จะเป็นนามธรรมประเภท ADTs มักจะมีการใช้งานที่ไม่ซ้ำกันในโปรแกรม เมื่อภาษาของคุณมีโมดูลเป็นไปได้ที่จะมีการใช้งาน ADT หลายครั้ง แต่พวกเขาไม่สามารถทำงานร่วมกันได้ สำหรับฉันแล้วดูเหมือนว่าในบทความของ Cook มันเกิดขึ้นเป็นกรณีที่สำหรับตัวอย่างที่เฉพาะเจาะจงของชุดที่ใช้ในกระดาษของ Cook วัตถุสามารถดูได้ว่าเป็นฟังก์ชั่นพิเศษ ฉันไม่คิดว่าวัตถุโดยทั่วไปสามารถดูได้เป็นฟังก์ชั่นที่มีลักษณะเฉพาะ นอกจากนี้กระดาษของ Aldritch พลังแห่งการใช้งานร่วมกันได้: ทำไมวัตถุจึงหลีกเลี่ยงไม่ได้ ¹แนะนำ คำจำกัดความของแม่ครัวระบุว่าการจัดส่งแบบไดนามิกเป็นคุณสมบัติที่สำคัญที่สุดของวัตถุ เห็นด้วยกับเรื่องนี้และกับอลันเคย์เมื่อเขาพูด OOP สำหรับฉันหมายถึงเพียงการส่งข้อความการเก็บรักษาในท้องถิ่นและการป้องกันและการซ่อนกระบวนการของรัฐและการผูกมัดปลายสุดของทุกสิ่ง อย่างไรก็ตามสไลด์บรรยายร่วมเหล่านี้ไปยังกระดาษของ Aldritch แนะนำว่าคลาส Java เป็น ADTs ในขณะที่ส่วนต่อประสาน Java เป็นวัตถุ - และแน่นอนว่าการใช้อินเตอร์เฟซ "วัตถุ" สามารถทำงานร่วมกันได้ (หนึ่งในคุณสมบัติหลักของ OOP ตามที่กำหนด ) คำถามของฉันคือ ฉันถูกต้องหรือไม่ที่จะบอกว่าฟังก์ชั่นพิเศษไม่ใช่คุณสมบัติหลักของวัตถุและ …

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