Một số ví dụ tốt, đơn giản cho hàng đợi là gì? [đóng cửa]


9

Tôi đang dạy CS2 ( Java and data structures) và đang gặp một số khó khăn khi đưa ra các ví dụ hay để sử dụng khi dạy hàng đợi. Hai ứng dụng chính mà tôi sử dụng chúng là multithreadedtruyền tin nhắn (nhưng lập trình MT nằm ngoài phạm vi của khóa học) và BFS-style algorithms(và tôi sẽ không bao gồm các biểu đồ cho đến sau này trong nhiệm kỳ).

Tôi cũng muốn tránh các ví dụ giả định. Hầu hết mọi thứ mà tôi nghĩ đến, nếu tôi thực sự sẽ giải quyết chúng theo cách đơn luồng, tôi sẽ chỉ sử dụng một danh sách chứ không phải là một hàng đợi. Tôi có xu hướng chỉ sử dụng hàng đợi khi quá trình xử lý và khám phá được xen kẽ (ví dụ: tìm kiếm) hoặc trong các trường hợp đặc biệt khác như bộ đệm giới hạn độ dài (ví dụ: duy trì N mục cuối ). Trong phạm vi thực tế, tôi đang cố gắng dạy cho học sinh của mình những cách tốt để thực sự làm mọi thứ trong các chương trình thực tế, không chỉ là đồ chơi để thể hiện một tính năng.

Bất kỳ đề xuất nào về các thuật toán tốt, đơn giản hoặc các ứng dụng của hàng đợi mà tôi có thể sử dụng làm ví dụ nhưng điều đó đòi hỏi tối thiểu các kiến ​​thức trước đó?


+1, nhưng tôi không kiềm chế việc tạo thẻ 'hàng đợi', vì nó chỉ chứa câu hỏi của bạn. Tôi đã sử dụng 'cấu trúc dữ liệu'.
K.Steff

@ K.Steff, bạn có thể có cả hai :-) Lưu ý rằng bất kỳ thẻ mới nào chỉ được liên kết với một câu hỏi duy nhất ở đầu.
Péter Török

1
Việc che hàng đợi khi bạn che BFS là điều tự nhiên. Tại sao không lưu hàng đợi cho đến khi đó? Bạn không phải bao gồm Hàng đợi với danh sách được liên kết và danh sách mảng chỉ vì chúng cũng có biểu diễn tuyến tính.
kevin cline

@ PéterTörök Tôi nhận ra rằng tất cả các thẻ bắt đầu trống, nhưng tìm kiếm 'hàng đợi' mang lại 313 câu hỏi và không có câu hỏi nào khác tạo ra thẻ 'hàng đợi'. Dù sao đây cũng chỉ là IMO
K.Steff

Một chủ đề định kỳ trong các câu trả lời dường như là mô phỏng của hàng đợi trong thế giới thực. Suy nghĩ của tôi cho đến nay là tôi thích sử dụng các ví dụ về những thứ mà tôi sẽ sử dụng hàng đợi để giải quyết vấn đề thực sự phát sinh trong lập trình, và rất nhiều ví dụ trong thế giới vật lý tỏa sáng tốt nhất trong môi trường đồng thời. Tuy nhiên, với sự lặp lại của chủ đề này, nó cũng có thể là tôi không phải là một dòng suy nghĩ hữu ích. Hãy tiếp tục những gợi ý! Và cảm ơn tất cả sự giúp đỡ tuyệt vời của bạn.
Michael Ekstrand

Câu trả lời:


14

Khi tôi học xếp hàng, giáo sư của tôi luôn sử dụng ví dụ về cửa hàng. Có 1 hoặc nhiều thanh ghi mở tại bất kỳ thời điểm nào và Khách hàng nhập một hàng này hoặc hàng khác và di chuyển qua hàng đợi đó để mua tất cả các mặt hàng của họ.

Chúng tôi thực sự phải thực hiện một chương trình đơn giản có thể di chuyển Khách hàng thông qua Sổ đăng ký, vì vậy nếu bạn thực sự tìm kiếm một chương trình, bạn có thể cung cấp cho sinh viên ví dụ này đơn giản và dễ hiểu, nhưng cũng là điều mà mọi sinh viên đều thấy trong cuộc sống thực và vì vậy nó có thể giúp họ hiểu khái niệm tốt hơn.


Như tôi đã nói, ví dụ này rất trực quan và cũng thường được sử dụng;)
marktani

1
Bạn có thể thêm độ phức tạp bằng cách có một hàng đợi ưu tiên cho khách hàng với đặc quyền (gói Aero).
Sixty feetersdude

1
IMO, những ví dụ dễ nhất là những ví dụ chúng ta gặp trong cuộc sống. Một ví dụ 'dòng' là một đại diện tuyệt vời của hàng đợi và sẽ giúp học sinh của bạn học hỏi. Trong thực tế, khi tôi nghĩ về hàng đợi và cách xác định các hoạt động của chúng, tôi thường nghĩ về ví dụ 'dòng' để giúp tôi hình dung nó tốt hơn.
Nicholas

Đây cũng là một cơ hội tuyệt vời để chạm nhanh vào lý thuyết xếp hàng: tại sao một dòng duy nhất phục vụ nhiều thanh ghi tốt hơn một dòng trên mỗi thanh ghi. Hãy để họ xây dựng một mô phỏng và chơi với nó. The Guy Guy có một lời giải thích đơn giản, tuyệt vời: engineerguy.com/ideo/video-lines.htmlm
jpeacock

5

Khi tôi học xếp hàng, giáo viên của tôi đã giới thiệu họ với tôi bằng cách sử dụng một đội hình cho xe ô tô do cảnh sát kiểm soát. Có một hàng đợi giữ những chiếc xe ("hàng đợi") và người cảnh sát sẽ luôn điều khiển chiếc xe tiếp theo trong hàng đợi và gửi nó cho đồng nghiệp của mình để kiểm tra thêm hoặc để chiếc xe đi qua.

Một ví dụ rất thường được sử dụng là hàng đợi trong siêu thị ...

Tại sao bạn không yêu cầu học sinh của mình đưa ra một số ví dụ?


+1 cho ví dụ siêu thị. Bạn đã đề cập đến nó trong khi tôi đang viết câu trả lời của tôi lên!
Mike Caputo

3

Một ví dụ mà tôi nghĩ đến là một dây chuyền chế biến bánh hamburger trong ví dụ McDonalds. Có nhiều loại bánh mì kẹp thịt khác nhau, mỗi loại có thể được sản xuất bởi một số công nhân khác nhau và mỗi loại có hàng đợi riêng. Từ đó, sau một thời gian, những chiếc burger đã sẵn sàng được thực hiện, theo thứ tự FIFO, bởi một trong những nhân viên thu ngân đã đặt mua loại bánh mì kẹp thịt đó.

Vì vậy, có nhiều nhà sản xuất và người tiêu dùng, và mỗi hàng đợi được giới hạn.


Tôi nhớ các bạn cùng lớp hồi đại học so sánh các phong cách khác nhau của việc sắp xếp đăng ký thức ăn nhanh với thiết kế bộ xử lý. Một hàng đợi được xử lý bởi nhiều thanh ghi? Mỗi đăng ký với hàng đợi riêng của mình? Nhiều công nhân trên cùng một dòng - xử lý siêu vô hướng. Thật thú vị.

3

Tôi đã nghĩ về việc sử dụng Amazon làm ví dụ, ở đâu đó trong hệ thống khổng lồ của họ phải có một hàng các đơn hàng cần được xử lý. mà có thể được xử lý bởi một enqueue và dequeue đơn giản. hệ thống sẽ thu hút một đơn đặt hàng trong hệ thống mỗi khi khách hàng mua một cuốn sách và một nhân viên nhà kho sau đó sẽ hủy đơn hàng để chọn và gửi nó.

Sau đó, thật dễ dàng để bắt đầu nói về hàng đợi ưu tiên, bằng cách giới thiệu khách hàng chính, có thể nhảy hàng đợi, bạn có thể giới thiệu hàng đợi ưu tiên.

Bạn đang sử dụng sách giáo khoa nào?


Carrano - Cấu trúc dữ liệu và trừu tượng hóa với Java .
Michael Ekstrand

2

Một ví dụ hoàn hảo về hàng đợi sẽ là một giao dịch xử lý ngân hàng đối với tài khoản. Thông thường, bạn sẽ thấy một danh sách các giao dịch "đang chờ xử lý" vào cuối ngày. Khi kế toán được thực hiện, các giao dịch được áp dụng cho tài khoản. Bạn thậm chí có thể vào khu vực của hàng đợi ưu tiên với điều này. Có vẻ như hầu hết các ngân hàng đều ưu tiên cho các khoản ghi nợ khi xử lý các giao dịch hàng đêm để họ có thể xử lý bạn với các khoản phí vượt dự thảo trước khi họ áp dụng bất kỳ khoản tín dụng đang chờ xử lý nào.

Các giao dịch được chèn vào hàng đợi theo thứ tự thời gian thực hiện và xử lý và áp dụng cho tài khoản theo quy trình kế toán.


2

Tôi đã từng là một lập trình viên viễn thông vì vậy điều này xuất hiện trong tâm trí:

Một đường dây nóng dịch vụ khách hàng. Một cuộc gọi đến, không có đủ nhà khai thác để xử lý cuộc gọi và nó được đặt trong hàng đợi. Cuộc gọi tiếp theo đến và nó cũng được đặt trong hàng đợi. Sau đó, khi toán tử tiếp theo khả dụng, cuộc gọi đầu tiên được nhập vào hàng đợi sẽ được gán cho toán tử khả dụng.


2

Các ví dụ thực tế rõ ràng sẽ là những thứ như dòng thanh toán, và như vậy, nhưng vì bạn đang tìm kiếm một ví dụ bắt nguồn từ tính toán, tôi có thể đề xuất hàng đợi lập lịch công việc không?

Tôi không biết có bao nhiêu sinh viên của bạn đã tham gia một lớp Hệ điều hành, nhưng thật may là tất cả họ đã sử dụng Trình quản lý tác vụ để kiểm tra các quy trình của họ vào lúc này hay lúc khác. Bạn có thể giới thiệu một ví dụ đơn giản về hàng đợi lập lịch và gán cho chúng một số bài tập về nhà để viết chương trình tạo (hoặc chấp nhận) một "tác vụ" có kích thước nhất định và xử lý chúng theo thứ tự FIFO khi chúng "khởi động" nó.

Đây là một khái niệm khá dễ hiểu, thể hiện ý tưởng rằng hàng đợi vận hành theo nội dung của nó theo thứ tự chấp nhận chúng và cung cấp cho chúng một giới thiệu (rất thô sơ và đơn giản) về lập lịch CPU. Chỉ cần hai bit của tôi.

Bạn có thể đưa ra ứng dụng của họ trong đa luồng, nhưng trừ khi các sinh viên đã có một số kinh nghiệm viết các chương trình luồng, tôi sẽ không giao việc cho họ có thể khiến hai người nản lòng. Tôi nhớ rằng tôi đã gặp khó khăn khi học cấu trúc dữ liệu (đặc biệt là trong Java, chưa làm C ++ và không học được gì về con trỏ) trong năm thứ hai đại học, vì vậy một ví dụ đơn giản nhưng thực tế liên quan trực tiếp đến điện toán có lẽ là tốt nhất.


1

Thế giới thực:

  • Bất cứ khi nào mọi người xếp hàng: nhân viên thu ngân tại cửa hàng tạp hóa, trong nhà hàng đang chờ bàn (bạn có thể làm việc trong những tiếng bíp mà đôi khi họ đưa ra tương tự), v.v ... Thật hữu ích khi bạn nhận thấy rằng ở Anh họ thường gọi các hàng đợi này thay vì các dòng (phổ biến trong NA)
  • Đọc sê-ri sách ', Author.publish => queue.push và student.read => queue.pop

Thế giới phi thực tế:

  • Xử lý bất kỳ dữ liệu được gửi nào trong một môi trường đơn luồng trong đó quá trình xử lý mất nhiều thời gian hơn so với việc gửi (hoạt động thanh toán cho các cửa hàng trực tuyến chẳng hạn.)
  • Bất kỳ bộ sưu tập FIFO nào có thể lặp đi lặp lại đều có thể sử dụng hàng đợi và sử dụng while(queue.peek)thay vì bộ lặp.

1

Tôi thích sử dụng các trò chơi làm ví dụ vì nó thường thú vị hơn một chút so với tệp IO hoặc bất cứ thứ gì bạn có thể nghĩ ra.

Vì vậy, khi bạn muốn đưa ra một số lệnh liên tiếp cho một đơn vị trong trò chơi chiến lược (ví dụ: Có một Zergling để trinh sát 4 góc của căn cứ theo thứ tự, sau đó tự sát vào trung tâm của căn cứ, một hàng đợi sẽ là một lựa chọn tốt .)

Hoặc có thể bạn có một ứng dụng chỉ có thể xử lý 30 khung hình mỗi giây, nhưng bạn có thể nhận được 4 hoặc 5 đầu vào giữa các khung. Nếu bạn có đầu vào vũ khí thay đổi và đầu vào bắn, bạn muốn chắc chắn rằng chúng được xử lý theo thứ tự chúng được nhận nếu không bạn có thể lựu đạn khi bạn muốn dùng dao. Và nếu bạn dùng lựu đạn khi bạn muốn dùng dao, bạn sẽ có một khoảng thời gian tồi tệ. (đặt nó vào meme của người hướng dẫn trượt tuyết và ném nó vào slide của bạn) :)

Một yêu cầu xử lý máy chủ là một yêu cầu tốt.

Một máy CNC lấy đầu vào. Máy chỉ có thể đi rất nhanh, vì vậy nó cần phải xếp hàng đầu vào.


1

Một số ví dụ tôi có thể nghĩ ra:

  • Máy tính - có thể giới thiệu tiền tố và tiền tố cùng một lúc
  • Hướng dẫn cách buộc giày. Không thể hoàn thành thao tác tiếp theo cho đến khi bạn thực hiện thao tác cuối cùng
  • Bộ đệm - Có thể bộ đệm điện thoại được sử dụng để lưu trữ số mà người dùng đã nhập nhưng chưa tạo ra âm thanh.
  • Tiêu hóa

1

Dây chuyền sản xuất đầy hàng đợi. Hãy nghĩ về một dòng chai rỗng hướng đến một máy làm đầy. Nhập trước xuất trước là cách tự nhiên để áp dụng quy trình tuần tự cho nhiều đối tượng. Hàng đợi cũng được sử dụng để tách rời một quy trình từ quy trình khác: máy rót không phải dừng ngay lập tức nếu có vấn đề ngắn hạn với máy dán nhãn.

Hàng đợi được sử dụng trong phần mềm theo cùng một cách. Đầu ra của một quy trình có thể được xếp hàng để nhập vào quy trình khác. Điều này đúng cho dù bạn đang nói về giao tiếp giữa các quá trình, giao tiếp giữa các luồng hoặc chỉ đơn giản là phá vỡ một quy trình phức tạp thành các phần mà tất cả có thể được xử lý bởi cùng một luồng.

Trong các hệ điều hành, hàng đợi thường được sử dụng để xử lý các đầu vào theo thứ tự. Ví dụ, hệ thống tệp có thể đọc các khối từ thiết bị lưu trữ và thêm chúng vào hàng đợi. Hoặc các ngắt xử lý những việc như nhấn phím và di chuyển chuột sẽ tạo ra các sự kiện được thêm vào hàng đợi sự kiện để bạn không nhận được "uqeeu" thay vì "xếp hàng" khi bạn nhập.

Đối với một bài tập sinh viên đơn giản, tôi nghĩ rằng bất kỳ nhiệm vụ nào chấp nhận một số đầu vào và sau đó xử lý chúng sẽ hoạt động. Ví dụ, bạn có thể yêu cầu họ viết một trình đánh giá biểu thức postfix đơn giản. Nó có ba phần:

  • đọc một đầu vào, thêm nó vào hàng đợi đầu vào và lặp lại cho đến khi không còn đầu vào nào nữa

  • lấy một mục từ hàng đợi

    • nếu mục là một số, đẩy nó vào ngăn xếp đối số
    • nếu mục là toán tử, hãy bật các đối số cần thiết và đánh giá
    • thêm kết quả vào hàng đợi đầu ra
    • lặp lại cho đến khi ngăn xếp trống
  • đọc một mục từ hàng đợi đầu ra, in nó và lặp lại cho đến khi hàng đợi đầu ra trống


1

Trong giảng dạy cấu trúc dữ liệu, tôi thường sử dụng ứng dụng mô phỏng hàng đợi ngân hàng nơi khách hàng chờ đợi trong hàng đợi và có một số cửa sổ dịch vụ.

Vấn đề là mô phỏng quá trình để tìm ra số liệu thống kê sau: khách hàng chờ thời gian trong hàng đợi (tối đa, tối thiểu, trung bình) và số lượng khách hàng chờ trong hàng đợi. Tôi sử dụng tần suất được xác định trước của việc đến khách hàng mới mỗi phút mỗi ngày và thời gian phục vụ trung bình của khách hàng trên cửa sổ dịch vụ với các giá trị từ trình tạo số ngẫu nhiên.

Kết quả sẽ là các khuyến nghị cho số lượng cửa sổ dịch vụ tối ưu và số lượng ghế tối ưu trong phòng chờ sẽ đảm bảo sự hài lòng của khách hàng. Ứng dụng rất thú vị cho sinh viên.


1

Bất kỳ thuật toán lập lịch hầu như luôn luôn liên quan đến một hàng đợi.

Điều này có thể bao gồm từ một hàng đợi đến trước được phục vụ trước đến yêu cầu bộ đệm cho một người tiêu dùng.

Đối với một hàng đợi lập lịch công việc phức tạp, nơi "nhiệm vụ" có thể có các ưu tiên và "công nhân" có các khả năng khác nhau.

Một trường hợp sử dụng tốt để chơi xung quanh có thể là "Bạn có một máy chủ in trung tâm với bốn máy in được gắn hai khả năng in màu, một có khả năng in hai mặt và một có khả năng in trên giấy lớn hơn. Người dùng có thể trả thêm tiền cho công việc gấp rút, hoặc, ít hơn nếu họ không bận tâm chờ đợi lâu hơn. Bạn có thể phải chịu các hình phạt nếu bạn giao hàng trễ để bạn muốn thông lượng càng nhiều càng tốt. "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.