Nhảy chuyển đến

Cái cử

Bổn giao diện đem giản yếu giới thiệu cái cử thuật toán.

Tóm tắt

Cái cử ( tiếng Anh: Enumerate ) là căn cứ vào đã có tri thức tới suy đoán đáp án một loại vấn đề cầu giải sách lược.

Cái cử tư tưởng là không ngừng mà suy đoán, từ khả năng tập hợp trung nhất nhất nếm thử, sau đó lại phán đoán đề mục điều kiện hay không thành lập.

Yếu điểm

Cấp ra giải không gian

Thành lập ngắn gọn toán học mô hình.

Cái cử thời điểm phải nghĩ kỹ: Khả năng tình huống là cái gì? Muốn cái cử này đó yếu tố?

Giảm bớt cái cử không gian

Cái cử phạm vi là cái gì? Là sở hữu nội dung đều yêu cầu cái cử sao?

Ở dùng cái cử pháp giải quyết vấn đề thời điểm, nhất định phải nghĩ kỹ này hai việc, nếu không sẽ mang đến không cần thiết thời gian chi tiêu.

Lựa chọn thích hợp cái cử trình tự

Căn cứ đề mục phán đoán. Tỷ như ví dụ mẫu trung yêu cầu chính là lớn nhất phù hợp điều kiện tố số, kia tự nhiên là từ lớn đến nhỏ cái cử tương đối thích hợp.

Ví dụ mẫu

Dưới là một cái sử dụng cái cử giải đề cùng ưu hoá cái cử phạm vi ví dụ.

Ví dụ mẫu

Một số tổ trung số lẫn nhau không giống nhau, cầu trong đó cùng vìSố đối cái số.

Giải đề ý nghĩ

Cái cử hai cái số số hiệu thực dễ dàng liền có thể viết ra tới.

1
2
3
for(inti=0;in;++i)
for(intj=0;jn;++j)
if(a[i]+a[j]==0)++ans;
1
2
3
4
foriinrange(n):
forjinrange(n):
ifa[i]+a[j]==0:
ans+=1
1
2
3
for(inti=0;in;++i)
for(intj=0;jn;++j)
if(a[i]+a[j]==0)++ans;

Đến xem cái cử phạm vi như thế nào ưu hoá. Bởi vì đề trung không yêu cầu số đối là có tự, đáp án chính là có tự tình huống gấp hai ( suy xét nếu(a, b)Là đáp án, như vậy(b, a)Cũng là đáp án ). Đối với loại tình huống này, chỉ cần thống kê nhân vi yêu cầu có trình tự lúc sau đáp án, cuối cùng lại thừa thượngThì tốt rồi.

Không ngại yêu cầu cái thứ nhất số muốn xuất hiện ở dựa trước vị trí. Số hiệu như sau:

1
2
3
for(inti=0;in;++i)
for(intj=0;ji;++j)
if(a[i]+a[j]==0)++ans;
1
2
3
4
foriinrange(n):
forjinrange(i):
ifa[i]+a[j]==0:
ans+=1
1
2
3
for(inti=0;in;++i)
for(intj=0;ji;++j)
if(a[i]+a[j]==0)++ans;

Không khó phát hiện nơi này đã giảm bớtCái cử phạm vi, giảm bớt này đoạn số hiệu thời gian chi tiêu.

Chúng ta có thể tại đây phía trên tiến thêm một bước ưu hoá.

Hai cái số hay không đều nhất định phải cái cử ra tới đâu? Cái cử trong đó một số lúc sau, đề mục điều kiện đã xác định mặt khác yếu tố ( một cái khác số ) điều kiện, nếu có thể tìm được một loại phương pháp trực tiếp phán đoán đề mục yêu cầu cái kia số hay không tồn tại, liền có thể bỏ bớt cái cử sau một số thời gian. Tương đối tiến giai mà, ở số liệu phạm vi cho phép dưới tình huống, chúng ta có thể sử dụng thùng1Ký lục biến lịch quá số.

1
2
3
4
5
6
boolmet[MAXN*2+1];
memset(met,0,sizeof(met));
for(inti=0;in;++i){
if(met[MAXN-a[i]])++ans;
met[MAXN+a[i]]=true;
}
1
2
3
4
5
met=[False]*(MAXN*2+1)
foriinrange(n):
ifmet[MAXN-a[i]]:
ans+=1
met[a[i]+MAXN]=True
1
2
3
4
5
boolean[]met=newboolean[MAXN*2+1];
for(inti=0;in;++i){
if(met[MAXN-a[i]])++ans;
met[MAXN+a[i]]=true;
}

Phức tạp độ phân tích

  • Thời gian phức tạp độ phân tích: ĐốiSố tổ biến lịch một lần là có thể hoàn thành đề mục yêu cầu, đươngCũng đủ đại thời điểm thời gian phức tạp độ vì.
  • Không gian phức tạp độ phân tích:.

Bài tập

Chú thích