อะไรคือตัวอย่างที่ดีและเรียบง่ายสำหรับคิว? [ปิด]


9

ฉันกำลังสอนCS2 ( Java and data structures) และฉันมีปัญหาในการหาตัวอย่างที่ดีที่จะใช้เมื่อสอนคิว แอปพลิเคชันหลักสองอย่างที่ฉันใช้สำหรับการmultithreadedส่งข้อความ (แต่การเขียนโปรแกรม MT อยู่นอกขอบเขตสำหรับหลักสูตร) ​​และBFS-style algorithms(และฉันจะไม่ครอบคลุมกราฟจนกว่าจะถึงระยะหลัง)

ฉันยังต้องการหลีกเลี่ยงตัวอย่างที่วางแผนไว้ สิ่งที่ฉันคิดว่าถ้าฉันจะแก้ปัญหาพวกเขาในแบบเธรดเดียวฉันจะใช้ลิสต์แทนคิว ฉันมักจะใช้คิวเฉพาะเมื่อการประมวลผลและการค้นพบเป็น interleaved (เช่นการค้นหา) หรือในกรณีพิเศษอื่น ๆ เช่นบัฟเฟอร์ที่มีความยาว จำกัด (เช่นการบำรุงรักษารายการNสุดท้าย) ในทางปฏิบัติฉันพยายามสอนนักเรียนถึงวิธีที่ดีในการทำสิ่งต่าง ๆ ในโปรแกรมจริงไม่ใช่แค่ของเล่นเพื่อแสดงคุณลักษณะ

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


+1 แต่ฉันจะละเว้นจากการสร้างแท็ก 'คิว' โดยพิจารณาว่ามีเพียงคำถามของคุณ ฉันได้ใช้ 'โครงสร้างข้อมูล'
K.Steff

@ K.Steff คุณสามารถมีทั้ง :-) โปรดทราบว่าแท็กใหม่ใด ๆ ที่เกี่ยวข้องกับคำถามเดียวเท่านั้นที่เริ่มต้น
PéterTörök

1
เป็นเรื่องธรรมดาที่จะครอบคลุมคิวเมื่อคุณครอบคลุม BFS ทำไมไม่บันทึกคิวจนกว่าจะถึงตอนนั้น? คุณไม่ต้องครอบคลุมคิวด้วยรายการที่เชื่อมโยงและรายการอาร์เรย์เพียงเพราะพวกเขายังมีการแสดงเชิงเส้น
วินไคลน์

@ PéterTörökฉันรู้ว่าแท็กทั้งหมดเริ่มว่างเปล่า แต่การค้นหา 'คิว' ให้ผลตอบคำถาม 313 คำถามและไม่มีใครสร้างแท็ก 'คิว' นี่เป็นเพียง IMO ต่อไป
K.Steff

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

คำตอบ:


14

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

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


ดังที่ฉันได้กล่าวมาตัวอย่างนี้มีทั้งความเป็นธรรมชาติและใช้บ่อยเกินไป)
marktani

1
คุณสามารถเพิ่มความซับซ้อนได้โดยมีคิวลำดับความสำคัญสำหรับลูกค้าที่มี perks (แผน Aero)
sixtyfootersdude

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

นี่เป็นโอกาสที่ดีที่จะได้สัมผัสกับทฤษฎีการจัดคิวสั้น ๆ : เหตุใดบรรทัดเดียวที่ให้บริการการลงทะเบียนหลายรายการดีกว่าหนึ่งบรรทัดต่อการลงทะเบียน ปล่อยให้พวกเขาสร้างแบบจำลองและเล่นกับมัน The Guy Guy มีคำอธิบายที่ดีและเรียบง่าย: engineerguy.com/videos/video-lines.htm
jpeacock

5

เมื่อฉันเรียนรู้การเข้าคิวครูของฉันแนะนำพวกเขาให้ฉันโดยใช้รถสำหรับควบคุมตำรวจ มีคิวรอรถ ("รอคิว") และตำรวจมักจะควบคุมรถคันต่อไปในคิวและส่งไปให้เพื่อนร่วมงานของเขาเพื่อตรวจสอบเพิ่มเติมหรือปล่อยให้รถผ่าน

ตัวอย่างที่ใช้บ่อยมากคือคิวในซูเปอร์มาร์เก็ต ...

ทำไมคุณไม่ขอให้นักเรียนยกตัวอย่างบ้าง?


+1 สำหรับซูเปอร์มาร์เก็ตตัวอย่าง คุณพูดถึงมันในขณะที่ฉันกำลังเขียนคำตอบของฉัน!
Mike Caputo

3

ตัวอย่างหนึ่งที่อยู่ในใจของฉันคือสายการผลิตแฮมเบอร์เกอร์ใน McDonalds มีเบอร์เกอร์หลายประเภทที่แตกต่างกันซึ่งแต่ละอันอาจผลิตโดยคนงานหลายคนและแต่ละคนก็มีคิวของตัวเอง จากนั้นหลังจากนั้นครู่หนึ่งก็มีการใช้เบอร์เกอร์ที่พร้อมใช้งานตามคำสั่ง FIFO โดยหนึ่งในพนักงานเก็บเงินที่สั่งเบอร์เกอร์ประเภทนั้น

ดังนั้นจึงมีผู้ผลิตและผู้บริโภคหลายรายและแต่ละคิวจะถูก จำกัด ขอบเขต


ฉันจำได้ว่าเพื่อนร่วมชั้นเรียนกลับมาเรียนที่วิทยาลัยเปรียบเทียบรูปแบบที่แตกต่างกันของการเตรียมการลงทะเบียนอาหารจานด่วนกับการออกแบบโปรเซสเซอร์ หนึ่งคิวจัดการโดยการลงทะเบียนหลาย ๆ ลงทะเบียนแต่ละครั้งด้วยคิวของตัวเอง? พนักงานหลายคนในสายเดียวกัน - การประมวลผลสเกลาร์ขั้นสูง มันสนุกมาก

3

ฉันคิดเกี่ยวกับการใช้ Amazon เป็นตัวอย่างบางแห่งในระบบใหญ่ของพวกเขาต้องมีคิวการสั่งซื้อที่ต้องจัดการ ซึ่งสามารถจัดการได้โดย enqueue และ dequeue ง่าย ๆ ระบบจะจัดคิวการสั่งซื้อในระบบทุกครั้งที่ลูกค้าซื้อหนังสือและจากนั้นคนเก็บบ้านก็จะทำคิวเพื่อรับและโพสต์มัน

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

คุณใช้ตำราอะไร


- Carrano โครงสร้างข้อมูลและนามธรรมกับ Java
Michael Ekstrand

2

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

การทำธุรกรรมจะถูกแทรกลงในคิวตามลำดับเวลาดำเนินการและ dequeued และนำไปใช้กับบัญชีโดยกระบวนการบัญชี


2

ฉันเคยเป็นโปรแกรมเมอร์โทรคมนาคมดังนั้นสิ่งนี้มาถึงใจ:

สายด่วนฝ่ายบริการลูกค้า การโทรเข้ามามีตัวดำเนินการไม่เพียงพอที่จะจัดการการโทรและอยู่ในคิว การโทรครั้งต่อไปจะเข้ามาและจะถูกวางในคิวด้วย จากนั้นเมื่อผู้ให้บริการรายต่อไปพร้อมใช้งานการโทรครั้งแรกที่เข้าสู่คิวจะถูกกำหนดให้กับผู้ให้บริการที่มีอยู่


2

ตัวอย่างของโลกแห่งความจริงที่เห็นได้ชัดคือสิ่งต่าง ๆ เช่นบรรทัดชำระเงินและเช่นนั้น แต่เนื่องจากคุณกำลังมองหาตัวอย่างที่ฝังรากอย่างเคร่งครัดในการคำนวณฉันอาจแนะนำคิวการจัดตารางเวลางานหรือไม่

ฉันไม่รู้ว่านักเรียนของคุณเข้าเรียนระบบปฏิบัติการได้กี่คน แต่ก็เป็นเรื่องดีที่พวกเขาทุกคนใช้ตัวจัดการงานเพื่อตรวจสอบกระบวนการของพวกเขาในบางจุดหรืออื่น ๆ คุณสามารถแนะนำตัวอย่างที่เรียบง่ายของคิวการกำหนดตารางเวลาและมอบหมายการบ้านบางอย่างให้พวกเขาเขียนโปรแกรมที่สร้าง (หรือยอมรับ) "งาน" ของขนาดที่กำหนดและประมวลผลตามลำดับ FIFO เมื่อ "เริ่ม"

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

คุณอาจนำแอปพลิเคชันของพวกเขามาใช้ในการมัลติเธรด แต่ถ้านักเรียนมีประสบการณ์ในการเขียนโปรแกรมเธรดแล้วฉันจะไม่มอบหมายงานให้พวกเขาที่อาจทำให้สองคนหงุดหงิด ฉันจำได้ว่าฉันมีปัญหาในการเรียนรู้โครงสร้างข้อมูล (โดยเฉพาะใน Java ที่ไม่ได้ทำ C ++ และไม่ได้เรียนรู้สิ่งใดเกี่ยวกับพอยน์เตอร์) ในวิทยาลัยชั้นปีที่สองของฉันดังนั้นตัวอย่างที่เรียบง่าย


1

โลกแห่งความจริง:

  • เมื่อใดก็ตามที่ผู้คนเข้าแถว: แคชเชียร์ที่ร้านขายของชำในร้านอาหารรอโต๊ะ (คุณสามารถทำงานใน beepers ที่บางครั้งพวกเขาแจกให้ในการเปรียบเทียบ) ฯลฯ มีประโยชน์เมื่อคุณสังเกตเห็นว่าในสหราชอาณาจักรพวกเขามักจะ เรียกคิวเหล่านี้แทนบรรทัด (ทั่วไปใน NA)
  • การอ่านหนังสือชุด ', author.publish => que.push และ student.read => que.pop

โลกที่ไม่ใช่ของจริง:

  • การประมวลผลข้อมูลใด ๆ ที่ส่งในสภาพแวดล้อมแบบเธรดเดียวซึ่งการประมวลผลใช้เวลานานกว่าการส่ง (การดำเนินการชำระเงินสำหรับร้านค้าออนไลน์เช่น)
  • คอลเลกชัน FIFO ใด ๆ ที่สามารถทำซ้ำได้สามารถใช้คิวและใช้while(queue.peek)แทนตัววนซ้ำ

1

ฉันชอบใช้เกมเป็นตัวอย่างเพราะโดยทั่วไปแล้วมันน่าตื่นเต้นกว่าไฟล์ IO หรืออะไรก็ตามที่คุณสามารถหาได้

ดังนั้นเมื่อคุณต้องการออกคำสั่งหลาย ๆ คำสั่งในแถวหนึ่งไปยังหน่วยในเกมวางแผน (เช่นให้ Zergling สอดแนม 4 มุมของฐานเพื่อฆ่าตัวตายในจุดศูนย์กลางของฐานคิวจะเป็นตัวเลือกที่ดี .)

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

คำขอจัดการเซิร์ฟเวอร์เป็นอีกสิ่งหนึ่งที่ดี

เครื่อง CNC รับอินพุต เครื่องสามารถไปได้อย่างรวดเร็วดังนั้นจึงต้องจัดคิวอินพุต


1

ตัวอย่างบางอย่างที่ฉันนึกได้:

  • เครื่องคิดเลข - สามารถแนะนำคำนำหน้าและคำนำหน้าในเวลาเดียวกัน
  • คำแนะนำในการผูกรองเท้า ไม่สามารถดำเนินการต่อไปจนกว่าคุณจะทำสิ่งสุดท้ายเสร็จสิ้น
  • บัฟเฟอร์ - อาจเป็นบัฟเฟอร์โทรศัพท์ที่ใช้เพื่อเก็บหมายเลขที่ผู้ใช้ป้อน แต่ยังไม่ได้ส่งเสียง
  • การย่อย

1

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

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

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

สำหรับการมอบหมายให้นักเรียนอย่างง่าย ๆ ฉันคิดว่างานใด ๆ ที่รับอินพุตจำนวนหนึ่งจากนั้นก็ประมวลผลให้ทำงาน ตัวอย่างเช่นคุณอาจให้พวกเขาเขียนตัวประเมินผลนิพจน์ postfix อย่างง่าย มันมีสามส่วน:

  • อ่านอินพุตเพิ่มลงในคิวอินพุตและทำซ้ำจนกว่าจะไม่มีอินพุตเพิ่มเติม

  • รับไอเท็มจากคิว

    • หากรายการเป็นตัวเลขให้กดลงบนสแต็กอาร์กิวเมนต์
    • หากรายการนั้นเป็นโอเปอเรเตอร์ให้ใส่อาร์กิวเมนต์ที่จำเป็นและประเมินผล
    • เพิ่มผลลัพธ์ไปยังเอาต์พุตคิว
    • ทำซ้ำจนกว่าสแต็กจะว่างเปล่า
  • อ่านรายการจากเอาต์พุตคิวพิมพ์และทำซ้ำจนกว่าคิวเอาต์พุตจะว่างเปล่า


1

ในการสอนโครงสร้างข้อมูลฉันมักจะใช้แอปพลิเคชันของการจำลองคิวธนาคารที่ลูกค้ารอคิวและมีหน้าต่างบริการจำนวนมาก

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

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


1

อัลกอริทึมการตั้งเวลาใด ๆ มักจะเกี่ยวข้องกับคิว

สิ่งนี้สามารถอยู่ในช่วงจากคิวที่ให้บริการแบบมาก่อนได้ก่อนถึงการร้องขอบัฟเฟอร์สำหรับผู้บริโภครายเดียว

ไปยังคิวการจัดตารางงานที่ซับซ้อนที่ "งาน" สามารถมีลำดับความสำคัญและ "คนงาน" มีความสามารถที่แตกต่างกัน

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

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