1 00:00:00,000 --> 00:00:05,259 2 00:00:05,259 --> 00:00:08,300 DOUG LLOYD: Vì vậy, trong CS50, chúng tôi đã được bảo hiểm rất nhiều cấu trúc dữ liệu khác nhau, 3 00:00:08,300 --> 00:00:09,180 bên phải? 4 00:00:09,180 --> 00:00:11,420 Chúng tôi đã nhìn thấy mảng, và liên kết danh sách, và các bảng băm, 5 00:00:11,420 --> 00:00:15,210 và cố gắng, ngăn xếp và hàng đợi. 6 00:00:15,210 --> 00:00:17,579 Chúng tôi cũng sẽ tìm hiểu một chút về cây và đống, 7 00:00:17,579 --> 00:00:20,120 nhưng thực sự những tất cả chỉ kết thúc lên được biến tấu trên một chủ đề. 8 00:00:20,120 --> 00:00:22,840 Có thực sự là những loại bốn ý tưởng cơ bản 9 00:00:22,840 --> 00:00:25,190 rằng tất cả mọi thứ khác có thể đun sôi xuống. 10 00:00:25,190 --> 00:00:28,150 Mảng, danh sách liên kết, bảng băm, và cố gắng. 11 00:00:28,150 --> 00:00:30,720 Và như tôi đã nói, có là các biến thể trên chúng, 12 00:00:30,720 --> 00:00:32,720 nhưng điều này là khá nhiều sẽ tóm tắt 13 00:00:32,720 --> 00:00:38,140 tất cả mọi thứ chúng ta sẽ nói chuyện trong lớp này về C. 14 00:00:38,140 --> 00:00:40,140 >> Nhưng làm thế nào để các biện pháp lên tất cả, phải không? 15 00:00:40,140 --> 00:00:44,265 Chúng tôi đã nói chuyện về những ưu và khuyết điểm của mỗi trong video riêng về họ, 16 00:00:44,265 --> 00:00:46,390 nhưng có rất nhiều con số bị ném ra xung quanh. 17 00:00:46,390 --> 00:00:48,723 Có rất nhiều chung suy nghĩ bị ném ra xung quanh. 18 00:00:48,723 --> 00:00:51,950 Hãy thử và củng cố nó chỉ vào một nơi. 19 00:00:51,950 --> 00:00:55,507 Hãy cân nhắc những ưu chống lại các khuyết điểm, và xem xét 20 00:00:55,507 --> 00:00:57,340 mà cấu trúc dữ liệu có thể là dữ liệu đúng 21 00:00:57,340 --> 00:01:01,440 cấu trúc cho tình hình cụ thể của bạn, bất cứ loại dữ liệu bạn đang lưu trữ. 22 00:01:01,440 --> 00:01:06,625 Bạn không nhất thiết phải luôn luôn cần phải sử dụng chèn siêu nhanh, xóa, 23 00:01:06,625 --> 00:01:10,761 và tra cứu của một Trie nếu bạn thực sự không quan tâm về chèn và xóa 24 00:01:10,761 --> 00:01:11,260 quá nhiều. 25 00:01:11,260 --> 00:01:13,968 Nếu bạn cần một cách nhanh chóng chỉ ngẫu nhiên truy cập, có thể là một mảng là tốt hơn. 26 00:01:13,968 --> 00:01:15,340 Vì vậy, chúng ta hãy chắt lọc đó. 27 00:01:15,340 --> 00:01:18,530 Hãy nói về một trong bốn loại chính của cấu trúc dữ liệu 28 00:01:18,530 --> 00:01:21,720 mà chúng tôi đã nói chuyện về, và chỉ nhìn thấy khi họ có thể là tốt, 29 00:01:21,720 --> 00:01:23,340 và khi họ có thể không được tốt như vậy. 30 00:01:23,340 --> 00:01:24,610 Vì vậy, chúng ta hãy bắt đầu với mảng. 31 00:01:24,610 --> 00:01:27,300 Vì vậy, chèn, đó là loại xấu. 32 00:01:27,300 --> 00:01:31,350 >> Chèn vào cuối mảng là OK, nếu chúng ta đang xây dựng một mảng như chúng tôi đi. 33 00:01:31,350 --> 00:01:33,570 Nhưng nếu chúng ta cần phải chèn các yếu tố vào trung lộ, 34 00:01:33,570 --> 00:01:35,550 nghĩ lại để chèn sắp xếp, có rất nhiều 35 00:01:35,550 --> 00:01:37,510 của việc chuyển đổi để phù hợp với một yếu tố trong đó. 36 00:01:37,510 --> 00:01:41,170 Và vì vậy nếu chúng ta sẽ chèn bất cứ nơi nào nhưng cuối mảng, 37 00:01:41,170 --> 00:01:43,590 đó có lẽ không tuyệt vời như vậy. 38 00:01:43,590 --> 00:01:46,710 >> Tương tự như vậy, xóa, trừ khi chúng tôi xóa từ cuối mảng, 39 00:01:46,710 --> 00:01:49,810 có lẽ cũng không quá lớn nếu chúng tôi không muốn để lại những khoảng trống rỗng, 40 00:01:49,810 --> 00:01:50,790 mà thông thường chúng ta không làm. 41 00:01:50,790 --> 00:01:54,700 Chúng tôi muốn loại bỏ một phần tử, và sau đó nó làm chúng snug một lần nữa. 42 00:01:54,700 --> 00:01:57,670 Và do đó, xóa các phần tử từ một mảng, cũng không tuyệt vời như vậy. 43 00:01:57,670 --> 00:01:58,820 >> Tra cứu, mặc dù, là rất tốt. 44 00:01:58,820 --> 00:02:00,920 Chúng tôi có quyền truy cập ngẫu nhiên, tra cứu thời gian liên tục. 45 00:02:00,920 --> 00:02:03,800 Chúng tôi chỉ nói bảy, và chúng tôi đi vào mảng di dời bảy. 46 00:02:03,800 --> 00:02:05,907 Chúng tôi nói 20, với đi tới mảng di dời 20. 47 00:02:05,907 --> 00:02:07,240 Chúng tôi không phải lặp qua. 48 00:02:07,240 --> 00:02:08,630 Đó là khá tốt. 49 00:02:08,630 --> 00:02:11,020 >> Mảng cũng tương đối dễ dàng để sắp xếp. 50 00:02:11,020 --> 00:02:14,040 Mỗi lần chúng tôi nói chuyện về một phân loại thuật toán, chẳng hạn như lựa chọn loại, 51 00:02:14,040 --> 00:02:18,820 sắp xếp chèn, bong bóng sắp xếp, hợp nhất sắp xếp, chúng tôi luôn luôn sử dụng mảng để làm điều đó, 52 00:02:18,820 --> 00:02:21,860 vì mảng là khá dễ dàng để sắp xếp, liên quan đến các cấu trúc dữ liệu 53 00:02:21,860 --> 00:02:22,970 chúng tôi đã nhìn thấy cho đến nay. 54 00:02:22,970 --> 00:02:24,320 >> Họ cũng là tương đối nhỏ. 55 00:02:24,320 --> 00:02:25,695 Không có rất nhiều không gian thêm. 56 00:02:25,695 --> 00:02:29,210 Bạn chỉ cần dành ra chính xác như nhiều khi bạn cần để giữ dữ liệu của bạn, 57 00:02:29,210 --> 00:02:30,320 và đó là khá nhiều đó. 58 00:02:30,320 --> 00:02:33,180 Vì vậy, họ đang khá nhỏ và hiệu quả theo cách đó. 59 00:02:33,180 --> 00:02:36,000 Nhưng nhược điểm khác, mặc dù, là chúng được cố định trong kích thước. 60 00:02:36,000 --> 00:02:38,630 Chúng ta phải khai báo chính xác như thế nào lớn, chúng tôi muốn mảng của chúng tôi có được, 61 00:02:38,630 --> 00:02:39,940 và chúng tôi chỉ nhận được một bắn vào nó. 62 00:02:39,940 --> 00:02:41,280 Chúng ta không thể phát triển và thu nhỏ nó. 63 00:02:41,280 --> 00:02:44,582 >> Nếu chúng ta cần phải phát triển hoặc thu nhỏ nó, chúng tôi cần phải khai báo một mảng hoàn toàn mới, 64 00:02:44,582 --> 00:02:47,750 copy tất cả các yếu tố của mảng đầu tiên vào mảng thứ hai. 65 00:02:47,750 --> 00:02:51,410 Và nếu chúng ta tính nhầm mà thời gian, chúng ta cần phải làm điều đó một lần nữa. 66 00:02:51,410 --> 00:02:52,760 Không tuyệt vời như vậy. 67 00:02:52,760 --> 00:02:58,750 Vì vậy, các mảng không cho chúng ta sự linh hoạt có số biến của các yếu tố. 68 00:02:58,750 --> 00:03:01,320 >> Với một danh sách liên kết, chèn là khá dễ dàng. 69 00:03:01,320 --> 00:03:03,290 Chúng tôi chỉ tack lên phía trước. 70 00:03:03,290 --> 00:03:04,892 Xóa cũng khá dễ dàng. 71 00:03:04,892 --> 00:03:06,100 Chúng ta phải tìm các yếu tố. 72 00:03:06,100 --> 00:03:07,270 Điều đó liên quan đến một số tìm kiếm. 73 00:03:07,270 --> 00:03:10,270 >> Nhưng một khi bạn đã tìm thấy phần tử bạn đang tìm kiếm, tất cả các bạn cần làm 74 00:03:10,270 --> 00:03:12,830 là thay đổi một con trỏ, có thể là hai nếu bạn có 75 00:03:12,830 --> 00:03:15,151 một liên kết list-- một gấp đôi danh sách liên kết, rather-- 76 00:03:15,151 --> 00:03:16,650 và sau đó bạn chỉ có thể giải phóng các node. 77 00:03:16,650 --> 00:03:18,399 Bạn không cần phải thay đổi tất cả mọi thứ xung quanh. 78 00:03:18,399 --> 00:03:22,090 Bạn chỉ cần thay đổi hai con trỏ, vì vậy đó là khá nhanh chóng. 79 00:03:22,090 --> 00:03:23,470 >> Lookup là xấu mặc dù, phải không? 80 00:03:23,470 --> 00:03:26,280 Để chúng tôi để tìm một phần tử trong một danh sách liên kết, 81 00:03:26,280 --> 00:03:29,154 dù đơn lẻ hoặc gấp đôi liên kết, chúng ta phải tìm kiếm nó là tuyến tính. 82 00:03:29,154 --> 00:03:32,320 Chúng ta phải bắt đầu từ đầu và di chuyển cuối cùng, hoặc bắt đầu di chuyển cuối 83 00:03:32,320 --> 00:03:33,860 để bắt đầu. 84 00:03:33,860 --> 00:03:35,474 Chúng tôi không có quyền truy cập ngẫu nhiên nữa. 85 00:03:35,474 --> 00:03:37,265 Vì vậy, nếu chúng ta đang làm một rất nhiều tìm kiếm, có thể 86 00:03:37,265 --> 00:03:39,830 một danh sách liên kết không phải là khá tốt như vậy đối với chúng tôi. 87 00:03:39,830 --> 00:03:43,750 >> Chúng tôi cũng thực sự khó khăn để sắp xếp, phải không? 88 00:03:43,750 --> 00:03:45,666 Cách duy nhất bạn có thể thực sự sắp xếp một danh sách liên kết 89 00:03:45,666 --> 00:03:47,870 là để sắp xếp nó như bạn xây dựng nó. 90 00:03:47,870 --> 00:03:50,497 Nhưng nếu bạn sắp xếp nó như bạn xây dựng nó, bạn sẽ không còn 91 00:03:50,497 --> 00:03:51,830 làm cho chèn nhanh nữa. 92 00:03:51,830 --> 00:03:53,746 Bạn sẽ không chỉ tacking đồ lên phía trước. 93 00:03:53,746 --> 00:03:55,710 Bạn phải tìm ra đúng chỗ để đặt nó, 94 00:03:55,710 --> 00:03:57,820 và sau đó chèn của bạn trở thành chỉ là về như xấu 95 00:03:57,820 --> 00:03:59,390 như chèn vào một mảng. 96 00:03:59,390 --> 00:04:03,130 Vì vậy, danh sách liên kết không tuyệt vời như vậy để phân loại dữ liệu. 97 00:04:03,130 --> 00:04:05,830 >> Họ cũng đang khá nhỏ, kích thước-khôn ngoan. 98 00:04:05,830 --> 00:04:08,496 Danh sách liên kết kép hơi lớn hơn so với danh sách đơn lẻ liên kết, 99 00:04:08,496 --> 00:04:10,620 mà là lớn hơn một chút là các mảng, nhưng nó không phải 100 00:04:10,620 --> 00:04:13,330 một số tiền rất lớn của không gian lãng phí. 101 00:04:13,330 --> 00:04:18,730 Vì vậy, nếu không gian là một bảo hiểm, nhưng không phải là một cao cấp thực sự mạnh 102 00:04:18,730 --> 00:04:22,180 điều này có thể đúng cách để đi. 103 00:04:22,180 --> 00:04:23,330 >> Bảng băm. 104 00:04:23,330 --> 00:04:25,850 Chèn vào một bảng băm là khá đơn giản. 105 00:04:25,850 --> 00:04:26,980 Đó là một quá trình hai bước. 106 00:04:26,980 --> 00:04:30,700 Trước tiên chúng ta cần phải chạy dữ liệu của chúng tôi thông qua một hàm băm để có được một mã băm, 107 00:04:30,700 --> 00:04:37,550 và sau đó chúng ta chèn phần tử vào bảng băm ở vị trí mã băm. 108 00:04:37,550 --> 00:04:40,879 >> Xóa, tương tự như danh sách liên kết, là dễ dàng một khi bạn tìm thấy phần tử. 109 00:04:40,879 --> 00:04:43,170 Bạn có thể tìm thấy nó đầu tiên, nhưng sau đó khi bạn xóa nó, 110 00:04:43,170 --> 00:04:45,128 bạn chỉ cần trao đổi một vài con trỏ, 111 00:04:45,128 --> 00:04:47,250 nếu bạn đang sử dụng chain riêng biệt. 112 00:04:47,250 --> 00:04:49,942 Nếu bạn đang sử dụng thăm dò, hoặc nếu bạn không 113 00:04:49,942 --> 00:04:51,650 sử dụng ở tất cả các chuỗi trong bảng băm của bạn, 114 00:04:51,650 --> 00:04:53,040 xóa thực sự là thực sự dễ dàng. 115 00:04:53,040 --> 00:04:57,134 Tất cả bạn cần làm là băm dữ liệu, và sau đó đi đến vị trí đó. 116 00:04:57,134 --> 00:04:58,925 Và giả sử bạn không có bất kỳ va chạm, 117 00:04:58,925 --> 00:05:01,650 bạn sẽ có thể xóa rất nhanh chóng. 118 00:05:01,650 --> 00:05:04,930 >> Bây giờ, tra cứu là nơi mà mọi thứ nhận được nhiều hơn một chút phức tạp. 119 00:05:04,930 --> 00:05:06,910 Đó là trên trung bình tốt hơn hơn danh sách liên kết. 120 00:05:06,910 --> 00:05:09,560 Nếu bạn đang sử dụng loạt, bạn vẫn còn có một danh sách liên kết, 121 00:05:09,560 --> 00:05:13,170 có nghĩa là bạn vẫn có tìm kiếm phương hại một danh sách liên kết. 122 00:05:13,170 --> 00:05:18,390 Nhưng bởi vì bạn đang dùng liên kết của bạn danh sách và tách nó trên 100 hoặc 1000 123 00:05:18,390 --> 00:05:25,380 hoặc n nguyên tố trong bảng băm của bạn, bạn danh sách liên kết đều là một thứ n kích thước. 124 00:05:25,380 --> 00:05:27,650 Tất cả chúng đều nhỏ hơn đáng kể. 125 00:05:27,650 --> 00:05:32,080 Bạn đã n danh sách liên kết thay vì một danh sách liên kết kích thước n. 126 00:05:32,080 --> 00:05:34,960 >> Và như vậy trong thế giới thực này không đổi yếu tố, mà tôi, chúng thường 127 00:05:34,960 --> 00:05:39,730 không nói về trong thời gian phức tạp, nó không thực sự làm cho một sự khác biệt ở đây. 128 00:05:39,730 --> 00:05:43,020 Vì vậy, tra cứu vẫn là tuyến tính tìm kiếm nếu bạn đang sử dụng loạt, 129 00:05:43,020 --> 00:05:46,780 nhưng độ dài của danh sách Bạn đang tìm kiếm thông qua 130 00:05:46,780 --> 00:05:50,080 là rất, rất ngắn bằng cách so sánh. 131 00:05:50,080 --> 00:05:52,995 Một lần nữa, nếu phân loại là của bạn Mục tiêu ở đây, băm bảng của 132 00:05:52,995 --> 00:05:54,370 có lẽ không phải là cách đúng để đi. 133 00:05:54,370 --> 00:05:56,830 Chỉ cần sử dụng một mảng nếu phân loại là thực sự quan trọng với bạn. 134 00:05:56,830 --> 00:05:58,590 >> Và họ có thể chạy âm giai của kích thước. 135 00:05:58,590 --> 00:06:01,640 Thật khó để nói liệu một bảng băm là nhỏ hay lớn, 136 00:06:01,640 --> 00:06:04,110 bởi vì nó thực sự phụ thuộc vào làm thế nào lớn bảng băm của bạn là. 137 00:06:04,110 --> 00:06:07,340 Nếu bạn chỉ sẽ được lưu trữ năm yếu tố trong bảng băm của bạn, 138 00:06:07,340 --> 00:06:10,620 và bạn có một bảng băm với 10.000 phần tử trong nó, 139 00:06:10,620 --> 00:06:12,614 có thể là bạn đang lãng phí rất nhiều không gian. 140 00:06:12,614 --> 00:06:15,030 Ngược lại là bạn cũng có thể có bảng băm rất nhỏ gọn, 141 00:06:15,030 --> 00:06:18,720 nhưng nhỏ hơn bảng băm của bạn được, lâu hơn mỗi của những danh sách liên kết 142 00:06:18,720 --> 00:06:19,220 được. 143 00:06:19,220 --> 00:06:22,607 Và như vậy có thực sự không có cách nào để xác định chính xác kích thước của một bảng băm, 144 00:06:22,607 --> 00:06:24,440 nhưng nó có thể là an toàn để nói nó thường 145 00:06:24,440 --> 00:06:27,990 sẽ lớn hơn so với một liên kết danh sách lưu trữ các dữ liệu tương tự, 146 00:06:27,990 --> 00:06:30,400 nhưng nhỏ hơn một Trie. 147 00:06:30,400 --> 00:06:32,720 >> Và cố gắng là thứ tư của các cấu trúc 148 00:06:32,720 --> 00:06:34,070 rằng chúng ta đang nói về. 149 00:06:34,070 --> 00:06:36,450 Chèn vào một Trie là phức tạp. 150 00:06:36,450 --> 00:06:38,400 Có rất nhiều động cấp phát bộ nhớ, 151 00:06:38,400 --> 00:06:40,780 đặc biệt là ở đầu, như bạn đang bắt đầu xây dựng. 152 00:06:40,780 --> 00:06:43,700 Nhưng đó là thời gian liên tục. 153 00:06:43,700 --> 00:06:47,690 Đó chỉ là yếu tố con người ở đây mà làm cho nó khó khăn. 154 00:06:47,690 --> 00:06:53,250 Có gặp phải con trỏ null, malloc không gian, đến đó, không gian có thể malloc 155 00:06:53,250 --> 00:06:54,490 từ đó một lần nữa. 156 00:06:54,490 --> 00:06:58,880 Việc sắp xếp các yếu tố đe dọa của con trỏ trong cấp phát bộ nhớ động 157 00:06:58,880 --> 00:07:00,130 là rào cản để xóa. 158 00:07:00,130 --> 00:07:04,550 Nhưng một khi bạn đã xóa nó, chèn thực sự đi kèm khá đơn giản, 159 00:07:04,550 --> 00:07:06,810 và chắc chắn là thời gian liên tục. 160 00:07:06,810 --> 00:07:07,680 >> Xóa là dễ dàng. 161 00:07:07,680 --> 00:07:11,330 Tất cả bạn cần làm là hướng xuống một vài con trỏ và miễn phí các nút, 162 00:07:11,330 --> 00:07:12,420 vì vậy đó là khá tốt. 163 00:07:12,420 --> 00:07:13,930 Lookup cũng khá nhanh. 164 00:07:13,930 --> 00:07:16,780 Nó chỉ dựa trên chiều dài của dữ liệu của bạn. 165 00:07:16,780 --> 00:07:19,924 Vì vậy, nếu tất cả các dữ liệu của bạn là năm chuỗi ký tự, 166 00:07:19,924 --> 00:07:22,590 Ví dụ, bạn đang lưu trữ năm chuỗi kí tự trong Trie của bạn, 167 00:07:22,590 --> 00:07:25,439 nó chỉ mất năm bước để tìm thấy những gì bạn đang tìm kiếm. 168 00:07:25,439 --> 00:07:28,480 Năm chỉ là một yếu tố không đổi, do đó, một lần nữa, chèn, xóa, và tra cứu 169 00:07:28,480 --> 00:07:31,670 đây là tất cả thời gian liên tục, hiệu quả. 170 00:07:31,670 --> 00:07:34,880 >> Một điều nữa là Trie của bạn là loại thực sự đã được sắp xếp, phải không? 171 00:07:34,880 --> 00:07:36,800 Nhờ thế nào chúng tôi yếu tố chèn, 172 00:07:36,800 --> 00:07:40,060 bằng cách đi từng chữ của quan trọng, hoặc từng số của key, 173 00:07:40,060 --> 00:07:45,084 thường, Trie của bạn kết thúc lên được loại được sắp xếp như bạn xây dựng nó. 174 00:07:45,084 --> 00:07:47,250 Nó không thực sự làm cho tinh thần để suy nghĩ về phân loại 175 00:07:47,250 --> 00:07:49,874 trong cùng một cách chúng ta nghĩ về nó với mảng, hoặc danh sách liên kết, 176 00:07:49,874 --> 00:07:51,070 hoặc các bảng băm. 177 00:07:51,070 --> 00:07:54,780 Nhưng trong một số ý nghĩa, bạn Trie được sắp xếp như bạn đi. 178 00:07:54,780 --> 00:07:58,630 >> Nhược điểm, tất nhiên, là một Trie nhanh chóng trở nên khổng lồ. 179 00:07:58,630 --> 00:08:02,970 Từ mỗi điểm giao nhau, có lẽ bạn have-- nếu key của bạn bao gồm các chữ số, 180 00:08:02,970 --> 00:08:04,880 bạn có 10 khác nơi bạn có thể đi đến đâu, 181 00:08:04,880 --> 00:08:07,490 có nghĩa là tất cả các nút chứa thông tin 182 00:08:07,490 --> 00:08:11,440 về các dữ liệu bạn muốn lưu trữ tại nút đó, cộng với 10 con trỏ. 183 00:08:11,440 --> 00:08:14,430 Trong đó, trên CS50 IDE, là 80 byte. 184 00:08:14,430 --> 00:08:17,220 Vì vậy, nó ít nhất là 80 byte cho mỗi nút mà bạn tạo ra, 185 00:08:17,220 --> 00:08:19,240 và điều đó thậm chí không đếm dữ liệu. 186 00:08:19,240 --> 00:08:24,950 Và nếu các nút của bạn là chữ thay vì chữ số, 187 00:08:24,950 --> 00:08:27,825 bây giờ bạn có 26 con trỏ từ mọi vị trí. 188 00:08:27,825 --> 00:08:32,007 Và 26 lần 8 có lẽ là 200 byte, hoặc một cái gì đó như thế. 189 00:08:32,007 --> 00:08:33,840 Và bạn có vốn và lowercase-- bạn có thể 190 00:08:33,840 --> 00:08:35,381 nhìn thấy nơi tôi đang đi với điều này, phải không? 191 00:08:35,381 --> 00:08:37,500 Các nút của bạn có thể nhận được thực sự lớn, và do đó, các Trie 192 00:08:37,500 --> 00:08:40,470 chính nó, tổng thể, có thể có được thực sự lớn, quá. 193 00:08:40,470 --> 00:08:42,630 Vì vậy, nếu không gian là ở mức cao phí bảo hiểm trên hệ thống của bạn, 194 00:08:42,630 --> 00:08:45,830 một Trie thể không phải là cách đúng đắn để đi, mặc dù lợi ích khác của nó 195 00:08:45,830 --> 00:08:47,780 đi vào chơi. 196 00:08:47,780 --> 00:08:48,710 Tôi Doug Lloyd. 197 00:08:48,710 --> 00:08:50,740 Đây là CS50. 198 00:08:50,740 --> 00:08:52,316