Trên một hàng đợi, kết thúc nào là đầu của Google?


18

Tôi đã luôn nghĩ rằng "cái đầu" của hàng đợi là yếu tố tiếp theo được đọc và không bao giờ thực sự đặt câu hỏi về cách sử dụng đó. Vì vậy, một thư viện danh sách liên kết mà tôi đã viết, được sử dụng để duy trì hàng đợi, đã mã hóa thuật ngữ đó: chúng tôi có một list1_headmacro truy xuất phần tử đầu tiên; khi sử dụng thư viện này trong hàng đợi, đây sẽ là phần tử đầu tiên bị xóa.

Nhưng một nhà phát triển mới trong nhóm đã quen với việc hàng đợi được thực hiện theo cách khác. Ông mô tả một hàng đợi giống như một con chó: bạn nhét vào đầu và gỡ ra ở đuôi. Đây là một mô tả đủ thông minh mà tôi cảm thấy như việc sử dụng của anh ta phải được phổ biến rộng rãi hơn và tôi không có một mô tả tương tự gợi lên về việc sử dụng ưa thích của tôi.

Vì vậy, tôi đoán, có hai câu hỏi liên quan: 1, "cái đầu" của hàng đợi có ý nghĩa gì với bạn? và 2, tại sao chúng ta sử dụng từ "đầu" để mô tả khái niệm đó?


1
"Anh ta mô tả một hàng đợi cư xử như một con chó" ... Nghe có vẻ như một anh chàng vui vẻ làm việc cùng - Đừng để anh ta ở gần một khách hàng.
NoChance

1
Tôi không biết, nhưng tôi đã đoán được cách thực hiện của bạn chứ không phải con chó.
Izkata

Một lời giải thích tốt khác về sự khác biệt giữa QUEUE và STACK: http://pages.cs.wisc.edu/~mcw/cs367/lectures/stacks.html
Ythalo Rossy

Ngoài ra, trong sách giáo khoa, danh sách liên kết (đơn lẻ) thường được giới thiệu trước các cấu trúc dữ liệu khác như ngăn xếp và hàng đợi, và sau đó chúng được xây dựng trên cấu trúc danh sách được liên kết (không nhất thiết là cách ưa thích để xây dựng các cấu trúc dữ liệu này ngày nay vì nhớ cache). Một danh sách được liên kết thường sẽ có một con trỏ đầu (tham chiếu đến phần tử đầu tiên) và một con trỏ đuôi (đến cuối cùng); trong cách sắp xếp này, thật dễ dàng để chèn vào đầu đuôi loại bỏ khỏi đầu - vì vậy, trong một hàng đợi như vậy, bạn loại bỏ từ phía trước. Nhưng lưu ý rằng đây thực sự là một chi tiết thực hiện nội bộ.
Filip Milovanović

BTW, hãy nghĩ rằng nó một phần là một thứ liên quan đến ngôn ngữ, nhưng đó cũng là về cách chúng ta khái niệm hóa những gì một hàng đợi làm. Đối với hầu hết những người biết ý nghĩa của từ "hàng đợi", hoặc được giới thiệu với khái niệm với phép ẩn dụ đó (chờ xếp hàng), phần thoát là ở phía trước / đầu; Tôi nghi ngờ bạn của bạn khái niệm nó giống như một loại đường ống, trong đó bạn đẩy các vật ở một đầu (bắt đầu, hoặc theo một cách nào đó, "đầu") của đường ống, và chúng thoát ra ở đầu kia.
Filip Milovanović

Câu trả lời:


29

Bạn vào phía sau hàng đợi và rời khỏi phía trước. Trong hầu hết các xã hội, điều đó có nghĩa là cái đầu là mặt trước, và các vật phẩm được loại bỏ khỏi đầu.

Các Javadoc cho Queue dường như đồng ý với định nghĩa cổ điển (tức là một bản gốc của bạn):

Dù thứ tự được sử dụng là gì, phần đầu của hàng đợi là phần tử sẽ bị xóa bởi một lệnh gọi để loại bỏ () hoặc thăm dò ý kiến ​​(). Trong hàng đợi FIFO, tất cả các phần tử mới được chèn vào phần đuôi của hàng đợi.


4
C ++ STL cũng đồng ý.
Fabio Ceconello

Ngoài ra thuật ngữ phổ biến cho FIFO / LIFO là xóa khỏi đầu hàng đợi / Ngăn xếp. Đỉnh của con chó là đầu, không phải đuôi. :-D
Spencer Kormos

Có vẻ như bạn đã trả lời câu hỏi đầu tiên, thực sự thông thường là cách sử dụng mà tôi hiểu là truyền thống ... Cảm ơn bạn đã tham khảo. Nhưng nó không phải là sắt thép đối với tôi tại sao mặt trước của hàng đợi được gọi là "đầu" ...
Aidan Cully

... vậy chúng ta sẽ tranh thủ vật phẩm nào? ;)
ell

1
Đuôi của một con chó là đầu của hàng đợi.
Caleb

8

Những gì mọi người ở Hoa Kỳ thường gọi là một dòng, như trong những gì bạn đứng ở bưu điện, những người ở các nước nói tiếng Anh khác gọi một hàng đợi. Vì vậy, người Mỹ sẽ dễ dàng giữ thuật ngữ này hơn nếu bạn thay thế "dòng" cho "hàng đợi". Nói cách khác, khi bạn ở trong đầu, hoặc phía trước của dòng, bạn là người tiếp theo được gọi.


Có lẽ đây là một câu hỏi về tiếng Anh, vì vấn đề dường như xuất hiện là "tại sao chúng ta gọi người đứng đầu?"
Aidan Cully

3
@AidanCully: bởi vì đầu trên một cơ thể là (trong bốn lần và các động vật khác được định hướng theo chiều ngang) hướng về phía trước, hoặc phía trước.
outis

Đó là lời giải thích tốt nhất có thể cho người Mỹ chúng ta.
andDevW

4

Cả hai quy ước đều được sử dụng chung. Theo kinh nghiệm của tôi, khi nói về hàng đợi nói chung, phần tử đứng đầu là phần tiếp theo ra khỏi hàng đợi và phần đuôi là nơi các phần tử đi vào hàng đợi. Điều này phù hợp với việc sử dụng tiếng Anh hàng ngày, chúng tôi xếp hàng ở phía sau và tiếp theo sẽ được phục vụ ở phía trước hoặc đầu. (Và nếu bạn cắt, nó sẽ ở phía sau của dòng dành cho bạn!)

Tuy nhiên, khi một hàng đợi (còn gọi là FIFO) được triển khai như một bộ đệm vòng , các thuật ngữ thường được đảo ngược, bởi vì phần được sử dụng của bộ đệm vòng giống như một con rắn đi vòng tròn. Giả sử con rắn đang di chuyển về phía trước, đầu tự nhiên là đầu dẫn đến sự di chuyển, cũng là kết thúc mà các vật phẩm đến được đưa vào.


Điều đáng nói là bộ đệm tròn trong nhân Linux , sử dụng quy ước rằng các mục được thêm vào phần đầu và được loại bỏ ở phần đuôi.
Craig McQueen
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.