Điều kiện của mô hình trong bài
Tệp nhóm giả định có các danh sách:
| Tài khoản | Nhóm tham gia |
|---|---|
| Mẫu A | Lập trình, Đọc sách, Cờ vua |
| Mẫu B | Lập trình, Đọc sách, Cờ vua, Âm nhạc |
| Mẫu C | Lập trình, Đọc sách, Âm nhạc |
| Mẫu D | Âm nhạc |
Theo quy tắc bài toán, hai tài khoản được đề xuất cho nhau nếu có **ít nhất 3 nhóm chung**. Đúng3 vẫn đủ; dùng>=3. Danh sách đề xuất không chứa chính tài khoản đang xét. Đây là quy tắc của dữ liệu thực hành trong bài.
Một danh sách mới cho mỗi tài khoản
```python
def recommendations(names, groups):
result = []
for i in range(len(names)):
suggested = []
for j in range(len(names)):
if i != j and len(common_values(groups[i], groups[j])) >= 3:
suggested.append(names[j])
result.append((names[i], suggested))
return result
```
Vòng ngoài chọn i. Vòng trong xét các j khác i, đếm số nhóm chung rồi giữ names[j] nếu đạt ngưỡng. suggested=[] đặt trong vòng ngoài để kết quả của tài khoản trước không lọt sang tài khoản sau.
Kết quả mẫu: A được đề xuất B; B được đề xuất A,C; C được đề xuất B; D không có đề xuất. Dù A có ba nhóm chung với chính A, điều kiện i!=j loại trường hợp ấy.
Kiểm đúng trường hợp bằng ngưỡng
Chạy:
```text
python3 g11-cs-danh-sach-chung.py de-xuat g11-cs-nhom.inp
```
Đối chiếu từng hàng của kết quả với bảng. A và B có đúng 3 nhóm chung nên vẫn cần xuất. A và C chỉ chung Lập trình,Đọc sách nên không xuất cặp đó. Mẫu D có danh sách đề xuất[]; một tệp chỉ có một tài khoản cũng không đề xuất chính nó.
Bài luyện
A và B có đúng 3 nhóm chung. Theo quy tắc, có được đề xuất không?
Chính tài khoản đang xét bị loại.
Điều kiện kiểm là>=3.
Đó là dấu>3, khác ngưỡng bài toán.
Không yêu cầu các danh sách giống nhau hoàn toàn.
Lời giải
Số nhóm chung 3 thỏa 3>=3. Do đó cặp A,Bđạt điều kiện dù không phải lớn hơn 3.
Bài luyện
Vì sao phải kiểm i!=j?
Cặp khác nhau có nhóm chung vẫn cần kiểm.
Thuật toán không đổi tên.
Cùng chỉ số là cùng một tài khoản.
Tên tài khoản trong tệp là duy nhất.
Lời giải
Một danh sách so với chính nó có thể có nhiều nhóm chung, nhưng không phải một tài khoản khác để đề xuất. Điều kiện i!=j loại cặp tự so ấy.
Bài luyện
Vì sao suggested=[] nằm trong vòng ngoài?
Đây chỉ tạo danh sách trong bộ nhớ.
Các điều kiện nhóm có thể cho kết quả khác nhau.
Số lượt vòng trong vẫn theo số tài khoản.
Không để kết quả của i trước còn trong kết quả của i sau.
Lời giải
Vòng ngoài chuyển sang một tài khoản khác. Tạo danh sách rỗng ở đầu lượt giúp chỉ thu các ứng viên phù hợp với tài khoản hiện tại.
Đang học