Một bất biến là gì?


129

Từ này dường như được sử dụng trong một số bối cảnh. Điều tốt nhất tôi có thể hình dung là chúng có nghĩa là một biến không thể thay đổi. Không phải đó là những gì hằng / trận chung kết (bạn là Java!) Dành cho?


Có lẽ họ nên gọi nó là không biến thể?
johnny

Câu trả lời:


188

Một bất biến là "khái niệm" nhiều hơn một biến. Nói chung, đó là một tài sản của trạng thái chương trình luôn luôn đúng. Một hàm hoặc phương thức đảm bảo rằng bất biến giữ được cho là duy trì bất biến.

Chẳng hạn, cây tìm kiếm nhị phân có thể có bất biến là với mọi nút, khóa của con trái của nút nhỏ hơn khóa riêng của nút. Hàm chèn được viết chính xác cho cây này sẽ duy trì bất biến đó.

Như bạn có thể nói, đó không phải là thứ bạn có thể lưu trữ trong một biến: đó là một tuyên bố về chương trình. Bằng cách tìm ra loại bất biến nào mà chương trình của bạn nên duy trì, sau đó xem lại mã của bạn để đảm bảo rằng nó thực sự duy trì các bất biến đó, bạn có thể tránh được các lỗi logic trong mã của mình.


1
Ví dụ tuyệt vời này sẽ tốt hơn nếu nó bao gồm câu trả lời của cero với liên kết wikipedia.
bỏ qua

2
Tuổi của cha mẹ lớn hơn tuổi của con đẻ của họ. Bối cảnh xung quanh sẽ thay đổi, nhưng bất biến không bao giờ thay đổi. Chẳng hạn, đó có thể là gia đình Smith có 2 con. Hoặc nó có thể là trong các loài khác của bất kỳ động vật có vú. Bối cảnh thay đổi, nhưng bất biến không thay đổi.
Truthadjustr

1
"... một tài sản của trạng thái chương trình luôn luôn đúng ..." - @jacob baskin - được viết tốt và cảm ơn vì điều này.
twknab

"... một tài sản của trạng thái chương trình luôn luôn đúng ..." - Tôi đồng ý rằng nó được viết tốt, nhưng nó có thể gây hiểu nhầm. Đầu tiên tôi hiểu nó là boolean đúng, nhưng tôi khá chắc chắn rằng nó có nghĩa là "... luôn luôn không đổi" (nhưng có lẽ chỉ vì tiếng Anh không phải là ngôn ngữ đầu tiên của tôi)
dev-null

29

Đó là một điều kiện bạn biết là luôn luôn đúng ở một vị trí cụ thể trong logic của bạn và có thể kiểm tra khi gỡ lỗi để tìm ra những gì đã sai.


17

Tôi thường xem chúng nhiều hơn về các thuật toán hoặc cấu trúc.

Ví dụ, bạn có thể có một bất biến vòng lặp có thể được khẳng định - luôn luôn đúng ở đầu hoặc cuối của mỗi lần lặp. Đó là, nếu vòng lặp của bạn được yêu cầu xử lý một tập hợp các đối tượng từ ngăn xếp này sang ngăn xếp khác, bạn có thể nói rằng | stack1 | + | stack2 | = c, ở trên cùng hoặc dưới cùng của vòng lặp.

Nếu kiểm tra bất biến không thành công, nó sẽ chỉ ra có gì đó không ổn. Trong ví dụ này, điều đó có thể có nghĩa là bạn đã quên đẩy phần tử đã xử lý lên ngăn xếp cuối cùng, v.v.


17

Sự kỳ diệu của wikipedia: Invariant (khoa học máy tính)

Trong khoa học máy tính, một vị từ mà nếu đúng, sẽ vẫn đúng trong suốt một chuỗi các hoạt động cụ thể, được gọi là (một) bất biến cho chuỗi đó.


2
Liên kết? Thuật ngữ kỹ thuật? ĐỌC HIỂU? WTF ? ;) Nghiêm túc mặc dù, liên kết tốt, nhưng một chút tóm tắt sẽ tốt đẹp.
quét bụi

10

Như dòng này nói:

Trong khoa học máy tính, một vị từ mà nếu đúng, sẽ vẫn đúng trong suốt một chuỗi các hoạt động cụ thể, được gọi là (một) bất biến cho chuỗi đó.

Để hiểu rõ hơn hy vọng ví dụ này trong C ++ sẽ giúp.

Hãy xem xét một kịch bản trong đó bạn phải nhận được một số giá trị và lấy tổng số của chúng trong một biến được gọi là countvà thêm chúng vào một biến được gọi làsum

Bất biến (một lần nữa nó giống như một khái niệm):

// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades

Mã cho ở trên sẽ là một cái gì đó như thế này,

int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}

Các mã trên làm gì?

1) Đọc đầu vào từ cinvà đặt chúng vàox

2) Sau khi đọc thành công, tăng countsum = sum + x

3) Lặp lại 1-2 cho đến khi dừng đọc (tức là ctrl + D)

Vòng lặp bất biến:

Bất biến phải là LUÔN LUÔN . Vì vậy, ban đầu bạn bắt đầu mã của bạn chỉ với điều này

while(cin>>x){
  }

Vòng lặp này đọc dữ liệu từ đầu vào tiêu chuẩn và lưu trữ trong x. Tốt và tốt. Nhưng bất biến trở thành sai vì phần đầu tiên của bất biến của chúng ta không được tuân theo (hoặc giữ đúng).

// we have read count grades so far, and

Làm thế nào để giữ bất biến đúng?

Đơn giản! số lượng tăng.

Vì vậy, ++count;sẽ làm tốt! Bây giờ mã của chúng tôi trở thành một cái gì đó như thế này,

while(cin>>x){
 ++count; 
 }

Nhưng

Ngay cả bây giờ chúng tôi bất biến (một khái niệm mà phải TRUE) là False vì bây giờ chúng tôi đã không đáp ứng phần thứ hai của chúng tôi bất biến.

// sum is the sum of the first count grades

Vậy phải làm gì bây giờ?

Thêm xvào sumvà lưu trữ nó trong sum( sum+=x) và lần sau cin>>xsẽ đọc một giá trị mới vào x.

Bây giờ mã của chúng tôi trở thành một cái gì đó như thế này,

while(cin>>x){
 ++count; 
 sum+=x;
 }

Hãy kiểm tra

Liệu mã có khớp với bất biến của chúng ta không

// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades

mã:

while(cin>>x){
 ++count; 
 sum+=x;
 }

Ah!. Bây giờ bất biến vòng lặp là True luôn luôn và mã hoạt động tốt.

Ví dụ trên được lấy và sửa đổi từ cuốn sách Gia tốc C ++ của Andrew-koening và Barbara-E


4

Một cái gì đó không thay đổi trong một khối mã


2

Tiếp theo từ những gì nó là, bất biến khá hữu ích trong việc viết mã sạch, vì biết về mặt khái niệm những gì bất biến sẽ có trong mã của bạn cho phép bạn dễ dàng quyết định cách tổ chức mã của mình để đạt được các mục tiêu đó. Như đã đề cập, chúng cũng hữu ích trong việc gỡ lỗi, vì kiểm tra xem liệu bất biến đang được duy trì thường là một cách tốt để xem liệu bất kỳ thao tác nào bạn đang cố gắng thực hiện có thực sự làm những gì bạn muốn không.


2

Đó thường là một đại lượng không thay đổi theo các hoạt động toán học nhất định. Một ví dụ là vô hướng, không thay đổi theo các phép quay. Ví dụ, trong hình ảnh cộng hưởng từ, rất hữu ích khi mô tả đặc tính mô bằng một bất biến xoay, bởi vì khi đó ước tính của nó không phụ thuộc vào hướng của cơ thể trong máy quét.


2

Câu trả lời này là dành cho đứa trẻ 5 tuổi của tôi. Đừng nghĩ về một bất biến là một giá trị số cố định hoặc cố định. Nhưng nó có thể. Tuy nhiên, nó còn hơn thế nữa.

Thay vào đó, một bất biến là một cái gì đó giống như một mối quan hệ cố định giữa các thực thể khác nhau. Ví dụ, tuổi của bạn sẽ luôn ít hơn so với cha mẹ ruột của bạn. Cả tuổi của bạn và tuổi của bố mẹ bạn đều thay đổi theo thời gian, nhưng mối quan hệ mà tôi đã đề cập ở trên là một bất biến.

Một bất biến cũng có thể là một hằng số. Ví dụ: giá trị của pilà tỷ lệ bất biến giữa chu vi của vòng tròn so với đường kính của nó. Bất kể vòng tròn lớn hay nhỏ, tỷ lệ đó sẽ luôn như vậy pi.


1

Bất biến ADT chỉ định các mối quan hệ giữa các trường dữ liệu (biến đối tượng) phải luôn luôn đúng trước và sau khi thực hiện bất kỳ phương thức cá thể nào.


0

Có một ví dụ tuyệt vời về một bất biến và tại sao nó lại quan trọng trong cuốn sách Java Đồng thời trong thực tiễn .

Mặc dù tập trung vào Java, ví dụ này mô tả một số mã chịu trách nhiệm tính toán các yếu tố của một số nguyên được cung cấp. Mã ví dụ cố gắng lưu trữ số cuối cùng được cung cấp và các yếu tố được tính toán để cải thiện hiệu suất. Trong kịch bản này, có một bất biến không được tính đến trong mã ví dụ đã khiến mã dễ bị ảnh hưởng bởi các điều kiện chủng tộc trong một kịch bản đồng thời.

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


0

Tất cả các câu trả lời ở đây đều tuyệt vời, nhưng tôi cảm thấy rằng tôi có thể làm sáng tỏ hơn về vấn đề này:

Bất biến từ quan điểm ngôn ngữ có nghĩa là một cái gì đó không bao giờ thay đổi. Khái niệm mặc dù thực sự đến từ toán học, đó là một trong những kỹ thuật chứng minh phổ biến khi kết hợp với cảm ứng.

Đây là cách chứng minh diễn ra, Nếu bạn có thể tìm thấy một bất biến ở trạng thái ban đầu, và rằng bất biến này vẫn tồn tại bất kể chuyển đổi [hợp pháp] nào được áp dụng cho trạng thái, thì bạn có thể chứng minh rằng Nếu một trạng thái nhất định không có điều này bất biến sau đó nó không bao giờ có thể xảy ra, bất kể chuỗi biến đổi nào được áp dụng cho trạng thái ban đầu.

Bây giờ cách suy nghĩ trước đây (một lần nữa kết hợp với cảm ứng) làm cho nó có thể dự đoán logic của phần mềm máy tính. Đặc biệt quan trọng khi việc thực thi diễn ra theo vòng lặp, trong đó bất biến có thể được sử dụng để chứng minh rằng một vòng lặp nhất định sẽ mang lại một kết quả nhất định hoặc nó sẽ không bao giờ thay đổi trạng thái của chương trình theo một cách nhất định.

Khi bất biến được sử dụng để dự đoán logic vòng lặp, nó được gọi là bất biến vòng lặp . Nó có thể được sử dụng bên ngoài các vòng lặp, nhưng đối với các vòng lặp thì nó thực sự quan trọng, bởi vì bạn thường có rất nhiều khả năng, hoặc vô số khả năng.

Lưu ý rằng tôi sử dụng từ "vị ngữ" logic của phần mềm máy tính và không chứng minh. Và đó là bởi vì trong khi bất biến toán học có thể được sử dụng như một bằng chứng, nó không bao giờ có thể chứng minh rằng phần mềm máy tính khi được thực thi sẽ mang lại những gì được mong đợi, do thực tế là phần mềm được thực thi trên nhiều trừu tượng, điều đó không bao giờ có thể được chứng minh rằng họ sẽ mang lại những gì được mong đợi (ví dụ về sự trừu tượng hóa phần cứng).

Cuối cùng, trong khi về mặt lý thuyết và nghiêm ngặt dự đoán logic phần mềm chỉ quan trọng đối với các ứng dụng quan trọng cao như Y tế và Quân sự. Bất biến vẫn có thể được sử dụng để hỗ trợ lập trình viên điển hình khi gỡ lỗi. Nó có thể được sử dụng để biết vị trí tại một địa điểm nhất định Chương trình thất bại vì nó không duy trì được một bất biến nhất định - nhiều người trong chúng ta vẫn sử dụng nó mà không nghĩ gì về nó.

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.