Java - Tại sao chúng ta gọi một mảng là một vector vector Cảnh?


20

Tôi đang đọc một cuốn sách về Lập trình Java và muốn xác nhận rằng tôi hiểu định nghĩa của từ "vectơ". Wikipedia nói rằng vectơ là "Một mảng một chiều", nguồn http://en.wikipedia.org/wiki/Vector .

Sẽ không đơn giản hơn nếu gọi mảng đơn giản là một mảng? Có bất kỳ lý do nào chúng ta cần sử dụng ngôn ngữ ưa thích như "vector" không? Có sự khác biệt giữa một mảng và một vectơ?


nhập mô tả hình ảnh ở đây

Nguồn: Bẻ khóa phỏng vấn mã hóa, tái bản lần thứ 4, bởi Gayle McDowell, trang 47.

FAQ
Q - Tại sao bạn không đăng bài này trên english.stackexchange.com?
A - Bởi vì tôi nghĩ chỉ những người định hướng khoa học máy tính mới có câu trả lời tốt.


1
Các vectơ không giống như ArrayLists, cụ thể là do đồng bộ hóa tích hợp. Thêm thông tin tại đây: stackoverflow.com/questions/2986296/
Ấn

Off-topic: Thuật ngữ "vectơ" không chỉ được sử dụng trong Java. 1. Thư viện C ++ có std::vector<…>("mảng" có kích thước động). 2. CLR (.NET runtime) cũng phân biệt giữa "mảng" và "vectơ", trường hợp sau là trường hợp đặc biệt của cái trước, cụ thể là một chiều, không dựa trên một chiều). Sự khác biệt đó rất quan trọng vì có những tối ưu hóa đặc biệt cho vectơ. 3. Trong toán học, một n- tuple số thực đôi khi còn được gọi là "vectơ".
stakx

1
@JeroenVannevel Tôi nghĩ rằng bạn đã nhầm lẫn giữa lớp Vector và khái niệm vectơ có thể được coi là một mảng đơn chiều.
C.Champagne

OT, nếu bạn muốn câu trả lời từ những người làm khoa học máy tính, tại sao lại đăng ở đây mà không phải tại cs.stackexchange? Và tại sao cờ java? Từ những gì tôi nhớ từ lớp lập trình của mình, có mảng và sau đó có danh sách liên kết. Ngoại trừ mảng, các thùng chứa (vectơ, danh sách, bản đồ, heap, v.v.) được triển khai dưới dạng danh sách liên kết.
imel96

2
Tại sao chúng ta gọi một vectơ là một mảng?
m3th0dman

Câu trả lời:


35

Trong cách sử dụng thông thường, một "mảng" có thể có nghĩa là một mảng một chiều hoặc một mảng nhiều chiều. Ngoài ra, trong toán học, ma trậnmảng 2 chiều trong khi vectơ là mảng 1 chiều.


8
Off-topic: Trong toán học, "vô hướng" có phải là mảng 0 chiều không?
stakx

6
@stakx: Vâng, điều đó hoàn toàn chính xác. Thông thường một vô hướng chỉ là một vô hướng, không ai thực sự gọi nó là "mảng 0 chiều". Nhưng ý tưởng là đúng.
Greg Hewgill

2
Chính xác hơn để nói rằng tất cả chúng đều là tenxơ. Từ Wolfram Mathworld: "Các thang đo là các khái quát của vô hướng (không có chỉ số), vectơ (có chính xác một chỉ số) và ma trận (có chính xác hai chỉ số) đến một số chỉ số tùy ý." (Rowland, Todd và Weisstein, Eric W. "Tenor." Từ MathWorld - Tài nguyên web Wolfram. Mathworld.wolfram.com/Tensor.html )
SOFe

Đối với những gì có giá trị, trong toán học, vectơ không phải là mảng 1 chiều. Vectơ là một phần tử của không gian vectơ, nghĩa là một tập hợp trong đó các phần tử có thể được thêm và nhân bởi vô hướng.
mlainz

Không gian vectơ nổi tiếng nhất là R ^ n, tập hợp các "mảng" của các số có phép nhân và phép nhân phần tử. Tập hợp các hàm thực cũng là một không gian vectơ, nhưng thông thường mọi người không nghĩ các hàm là mảng. Một mảng các ký tự sẽ không phải là một không gian vectơ, vì không có sự lựa chọn rõ ràng về phép cộng và phép nhân. Trong thuật ngữ toán học, một mảng là một tuple hoặc một chuỗi hữu hạn. Xem en.wikipedia.org/wiki/Vector_(mathatures_and_physics) để biết thêm ví dụ về các bộ dữ liệu không phải là vectơ.
mlainz

10

Các vectơ không chính xác là mảng. Không phải những người cổ điển nào. Chúng là các mảng động. Chúng có thể được thay đổi kích thước khi cần thiết thay vì có kích thước cố định. Chúng tương tự như ArrayLists nhưng không hoàn toàn giống nhau.

ArrayLists khác với vectơ ở chỗ vectơ đồng bộ hóa các hoạt động riêng lẻ, đây là điều bạn không muốn cho các mục đích tương tranh cụ thể theo Jon Skeet . Do đó, Vector đã bị từ chối ủng hộ ArrayList nhưng một số người vẫn gọi nó là Vector.

Các tên được bắt nguồn từ thuật ngữ toán học cho một ma trận 1 chiều. Đây là mặc dù cấu trúc thực sự là một n-tuple .


2
Tôi nghĩ rằng bạn đã nhầm lẫn giữa lớp Vector và khái niệm vectơ có thể được coi là một mảng đơn chiều và ils lưu ý cụ thể cho Java.
C.Champagne

@ C.Champagne Anh ấy đã sử dụng một ví dụ Java vì vậy đó là những gì tôi đã cho anh ấy. Tôi đã thêm định nghĩa cho cấu trúc toán học, về mặt kỹ thuật cũng không phải là "vectơ".
Kỹ sư thế giới

2
Tôi với @ C.Champagne. Nếu họ có nghĩa là Vector (lớp) thì văn bản sẽ sử dụng nắp V. Họ đã sử dụng chữ v viết thường chỉ định nghĩa cổ điển (không phải lớp) của một vectơ.
Giàn khoan

Ừm, vectơ được gọi là vectơ trong toán học . Ý bạn là gì, "về mặt kỹ thuật không phải là" vectơ ""?
Andres F.

@AresresF. Một tập hợp các số như một mảng hoặc "Vector" sẽ là một n-tuple theo cách hiểu của tôi vì nó là một tập hợp các giá trị rời rạc.
Kỹ sư thế giới

4

Thông thường, vectơmảng là cùng một thứ và được sử dụng thay thế cho nhau khi lập trình. Đó là ở hầu hết các nơi, vì vậy bạn không nên lo lắng nhiều về nó hầu hết thời gian.

Điều đó nói rằng, ngôn ngữ là không chính xác và đôi khi chúng ta có những từ có nghĩa khác nhau trong các bối cảnh khác nhau có nghĩa là cùng một điều, hoặc một từ có hai hoặc nhiều nghĩa khác nhau.

Trong C, một mảng là một chuỗi các phần tử dữ liệu cùng loại được lưu trữ trong bộ nhớ liền kề nhau. Java kế thừa ý nghĩa đó. Nó không giống như Danh sách hoặc Vector, vì các mảng cơ bản hơn các mảng.

Một vector là một cấu trúc toán học định nghĩa là một đối tượng có thể được thêm vào một đối tượng cùng loại, hoặc được nhân với bất kỳ số thực (hoặc phức tạp) kết quả là một vector của cùng loại. Nó cũng có một vài thuộc tính khác rất hữu ích.

Một vectơ có kích thước . Đó là số lượng tối thiểu của các vectơ khác nhau phải được kết hợp để có được mọi vectơ có thể có của loại đó. Vận tốc và gia tốc là các vectơ 3 chiều vì không gian có 3 hướng cơ sở và bằng cách thêm bội số của ba hướng cơ sở đó, bạn có thể có được bất kỳ vị trí nào trong không gian. Vị trí trong mặt phẳng là vectơ 2 chiều và các số riêng lẻ là vectơ 1 chiều.

Một cách để biểu diễn một vectơ có kích thước n là sử dụng một mảng gồm n phần tử, mỗi phần tử biểu thị bao nhiêu của mỗi vectơ cơ sở bạn phải thêm để có được vào vectơ của bạn.

Vì bạn có thể biểu diễn một vectơ bằng cách sử dụng một phần tử các yếu tố, theo thời gian, hai khái niệm đã được đánh đồng. Vì vậy, ở nhiều nơi, chúng chỉ đơn giản là cùng một thứ và trong một số ngôn ngữ, mảng được gọi là vectơ.

Một trường hợp khác trong đó một từ có hai nghĩa khác nhau là, ví dụ, kích thước . Định nghĩa wikipedia của vectơ là mảng 1 chiều là một ví dụ. Bạn không nói về kích thước vector ở đây. Bạn đang nói về đại diện máy tính của cấu trúc dữ liệu. Một vectơ 3 chiều có thể được biểu diễn bằng một mảng "1 chiều" có kích thước 3. 3 số. Một ma trận 3x3 có thể được biểu diễn bằng một mảng "2 chiều", đây là thứ mà các lập trình viên gọi là một mảng các mảng. Tuy nhiên, ma trận 3x3 cũng là một vectơ toán học của chiều 9 (vì nó có tất cả các thuộc tính của vectơ) và có 9 số. Nhầm lẫn hả?

Dù sao, tôi nghĩ rằng câu trả lời chỉ đơn giản là: đừng lo lắng. Tất cả phụ thuộc vào bối cảnh. Hai từ có nguồn gốc khác nhau, nhưng trong bối cảnh cấu trúc dữ liệu, khi chúng nói vectơ, chúng có nghĩa là chính xác mảng .


Tôi không nghĩ điều này là đúng. Trong hầu hết tất cả các tài liệu tôi chạy trên Array ngụ ý kích thước cố định, Vector ngụ ý cấu trúc có thể (nhưng không nhất thiết là) có kích thước động. Các định nghĩa toán học của các thuật ngữ là vô cùng sai lệch trong bối cảnh lập trình.
Chuu

-1

Các câu trả lời ở trên mô tả lý do tại sao lớp này khác với "Mảng" - và tôi nghi ngờ lý do một tên khác được sử dụng là do các lập trình viên được giúp đỡ bằng cách có một không gian tên được tổ chức tốt - nói cách khác nếu bạn nói về "Vector" rõ ràng chính xác ý nghĩa của lớp bạn, trong khi nếu tất cả các lớp tương tự chỉ là mảng thì nó sẽ không hoàn toàn rõ ràng.


-1

Tôi nghĩ thuật ngữ "vectơ" xuất phát từ std :: vector của C ++. Nó xuất hiện trước Java và C #.


3
Vui lòng (mạnh mẽ) xem xét thêm một tài liệu tham khảo bên ngoài để sao lưu ý kiến ​​của bạn.

-1

Nó chỉ là chỉnh sửa cẩu thả.

Các phiên bản đầu tiên của Java không bao gồm ArrayList. Thay vì ArrayList, Vector đã được sử dụng. ArrayList đã được thêm vào sau đó và hiện được sử dụng thay vì Vector cho hầu hết các mục đích. Tôi hy vọng rằng cuốn sách đã được viết trước khi ArrayList được thêm vào và khi văn bản được cập nhật, tham chiếu đến vectơ này thì không.

Tôi đề nghị bạn tránh loại sách "học tất cả trong mười phút" này. Nói chung chúng được viết nhanh chóng và chậm chạp. Trình độ kiến ​​thức này sẽ không giúp bạn có việc làm trong một cửa hàng nghiêm túc.

Thay vào đó hãy tìm kiếm những cuốn sách được đánh giá tốt bởi những người dùng được công nhận về công nghệ được đọc và đọc để hiểu.


1
"Phiên bản đầu ... đã"? Và là java.util.Vectorgì?
Phục hồi Monica - M. Schröder

1
Không dùng nữa là những gì java.util.Vector là. :-)
Brian Knoblauch

-1

Các thuật ngữ vector đến từ kỹ thuật / vật lý. Các vectơ đại diện cho các đường 2 và 3 chiều có hướng. Ví dụ: giả sử một viên đạn có vận tốc ngang là 20 m / s và vận tốc dọc là 10 m / s. Vì vậy, sau đó bạn sẽ đại diện cho điều này là (20,10). Nó bay theo một đường chéo phải, vì vậy bây giờ hãy xem các vectơ vận tốc toán học trở thành các mảng hay còn gọi là vectơ.


-2

Chúng tôi không gọi các vectơ mảng, hoặc bạn hiểu nhầm nguồn của bạn hoặc nguồn Java bị hiểu nhầm hoặc cả hai.
Mảng là một cơ sở hạ tầng khá khác với Vector, khác với Danh sách một lần nữa (mà mã đã dán của bạn sử dụng).

Tất nhiên, một vectơ toán học có thể được triển khai bằng Java bằng cách sử dụng một trong ba cơ chế và dưới mui xe hoặc cả Vector và Danh sách có thể được thực hiện bằng cách sử dụng mảng.

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.