در این مطلب، ویدئو Knuth—Morris—Pratt KMP – پیاده سازی strStr() – Leetcode 28 – Python با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 00:36:41
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:00,000 –> 00:00:02,800
به کد آموزشی dot io
2
00:00:02,800 –> 00:00:05,279
مراجعه کنید تا 10 عدد در اشتراک خود صرفه جویی کنید.
3
00:00:05,279 –> 00:00:07,440
4
00:00:07,440 –> 00:00:09,120
5
00:00:09,120 –> 00:00:11,040
6
00:00:11,040 –> 00:00:12,960
7
00:00:12,960 –> 00:00:15,599
رشته
8
00:00:15,599 –> 00:00:17,359
اما به جای حل آن با یک
9
00:00:17,359 –> 00:00:19,039
راه حل brute force که دفعه قبل انجام
10
00:00:19,039 –> 00:00:22,240
دادیم که حدود n برابر m بود، در
11
00:00:22,240 –> 00:00:24,080
واقع راه حل بسیار
12
00:00:24,080 –> 00:00:26,800
بهینه تری را با استفاده از یک الگوریتم بسیار استاندارد
13
00:00:26,800 –> 00:00:29,359
اما همچنین بسیار پیچیده
14
00:00:29,359 –> 00:00:32,238
به نام الگوریتم kmp انجام خواهیم داد.
15
00:00:32,238 –> 00:00:34,880
پیچیدگی زمانی آن بسیار بهتر
16
00:00:34,880 –> 00:00:37,600
است، در واقع o از n به علاوه m
17
00:00:37,600 –> 00:00:39,760
بسیار کارآمدتر است، اما نقطه ضعف
18
00:00:39,760 –> 00:00:42,480
آن این است که این مشکل را از یک
19
00:00:42,480 –> 00:00:45,920
مشکل آسان به یک مشکل بسیار
20
00:00:45,920 –> 00:00:48,879
بسیار سخت تبدیل می کند، به خصوص اگر
21
00:00:48,879 –> 00:00:51,199
نمی دانید این چیست. الگوریتم
22
00:00:51,199 –> 00:00:54,079
اساساً غیرممکن است که
23
00:00:54,079 –> 00:00:56,480
خودتان در مدت زمان کوتاهی به آن دست پیدا کنید، اما
24
00:00:56,480 –> 00:00:58,480
اگر آن را زودتر یاد بگیرید،
25
00:00:58,480 –> 00:01:00,879
ابتدا باید بتوانید آن را پیاده سازی کنید، اجازه دهید به
26
00:01:00,879 –> 00:01:02,640
سرعت مرور کنیم. از طریق راه حل brute force
27
00:01:02,640 –> 00:01:04,080
و نوعی درک
28
00:01:04,080 –> 00:01:07,119
انگیزه برای این الگوریتم kmp
29
00:01:07,119 –> 00:01:09,280
به یاد داشته باشید که نیروی brute
30
00:01:09,280 –> 00:01:10,960
یک رشته فرعی می گیرد در این مورد ما
31
00:01:10,960 –> 00:01:12,720
آن را سوزن و
32
00:01:12,720 –> 00:01:14,400
کل رشته اصلی که ما
33
00:01:14,400 –> 00:01:16,240
آن را انبار کاه می نامیم نام می بریم. برای زمینه
34
00:01:16,240 –> 00:01:19,680
این مشکل، ما میخواهیم یک
35
00:01:19,680 –> 00:01:22,080
زیر رشته سوزنی منطبق را در سمت راست انبار کاه پیدا
36
00:01:22,080 –> 00:01:24,240
کنیم، ابتدا سه کاراکتر اول را بررسی میکنیم که
37
00:01:24,240 –> 00:01:26,720
آیا با سوزن نوپ مطابقت دارند،
38
00:01:26,720 –> 00:01:28,400
سپس سه کاراکتر بعدی را بررسی میکنیم که آیا سه کاراکتر بعدی با سه
39
00:01:28,400 –> 00:01:30,400
کاراکتر بعدی مطابقت دارند یا خیر.
40
00:01:30,400 –> 00:01:32,880
و غیره
41
00:01:32,880 –> 00:01:35,119
درست است که ما اساساً هر
42
00:01:35,119 –> 00:01:37,520
رشته فرعی با طول سه در کل
43
00:01:37,520 –> 00:01:39,040
رشته را بررسی می کنیم، بنابراین این چیزی است که باعث می شود
44
00:01:39,040 –> 00:01:41,040
پیچیدگی زمانی واقعاً ناکارآمد باشد و اساساً
45
00:01:41,040 –> 00:01:43,759
هر دو رشته را با هم ضرب کنیم، اما در
46
00:01:43,759 –> 00:01:46,079
واقع این راه حل brute force
47
00:01:46,079 –> 00:01:48,640
در واقع بهتر از این است که
48
00:01:48,640 –> 00:01:51,360
مثلاً دو رشته ما را در نظر بگیرید. ابتدا بالاتر از
49
00:01:51,360 –> 00:01:52,640
آن باشد، ما فقط
50
00:01:52,640 –> 00:01:54,720
اولین کاراکترهای هر رشته را به سمت راست a
51
00:01:54,720 –> 00:01:56,960
و x مقایسه می کنیم تا بررسی کنیم که آیا این رشته فرعی است یا خیر.
52
00:01:56,960 –> 00:01:58,479
برابر با سوزن در این مورد،
53
00:01:58,479 –> 00:02:00,079
کاراکترهای اول حتی با هم مطابقت ندارند، بنابراین
54
00:02:00,079 –> 00:02:01,520
البته ما حتی مجبور نیستیم
55
00:02:01,520 –> 00:02:04,079
دو کاراکتر بعدی را دقیقاً بررسی کنیم، بنابراین در مرحله بعدی
56
00:02:04,079 –> 00:02:06,079
میخواهیم بدانیم آیا این کاراکتر با سه کاراکتر بعدی مطابقت دارد یا خیر،
57
00:02:06,079 –> 00:02:07,520
بنابراین ما فقط اولین کاراکتر را بررسی کردیم.
58
00:02:07,520 –> 00:02:09,598
کاراکترهایی که هنوز مطابقت
59
00:02:09,598 –> 00:02:11,038
ندارند، بنابراین ما دقیقاً همان کار را با
60
00:02:11,038 –> 00:02:12,560
این سه انجام میدهیم، اولین کاراکتر مطابقت نداشته باشد،
61
00:02:12,560 –> 00:02:14,000
سپس این سه را بررسی میکنیم که
62
00:02:14,000 –> 00:02:17,120
کاراکتر اول دوباره مطابقت نداشته باشد، بنابراین
63
00:02:17,120 –> 00:02:19,760
در این مورد این رشته هرگز
64
00:02:19,760 –> 00:02:22,400
در انبار کاه و در واقع پیچیدگی زمانی
65
00:02:22,400 –> 00:02:24,800
در واقع بزرگ بود o از n که در آن
66
00:02:24,800 –> 00:02:27,040
n به اندازه انبار کاه است، اصلاً
67
00:02:27,040 –> 00:02:30,239
خیلی ناکارآمد نبود که به
68
00:02:30,239 –> 00:02:32,480
شما نشان می دهد که kmp حتی در
69
00:02:32,480 –> 00:02:34,319
بیشتر مواقع فوق العاده مفید نیست، اما بیایید
70
00:02:34,319 –> 00:02:36,400
نگاهی بیندازیم. در مثالی که بسیار مفید خواهد بود،
71
00:02:36,400 –> 00:02:38,879
بنابراین این یک مثال بسیار خاص
72
00:02:38,879 –> 00:02:41,360
است که برای
73
00:02:41,360 –> 00:02:44,400
نشان دادن الگوریتم kmp ضروری است، اما در این
74
00:02:44,400 –> 00:02:46,640
مورد اگر سعی کنیم راه حل brute force را
75
00:02:46,640 –> 00:02:48,640
بدون kmp انجام دهیم،
76
00:02:48,640 –> 00:02:50,400
چهار کاراکتر اول را بررسی خواهیم کرد. آیا
77
00:02:50,400 –> 00:02:52,239
مطابقت دارند زیررشته ای که ما به دنبال آن هستیم، به
78
00:02:52,239 –> 00:02:54,239
خوبی کاراکتر اول با
79
00:02:54,239 –> 00:02:56,080
کاراکتر دوم مطابقت دارد با سومین
80
00:02:56,080 –> 00:02:58,319
همخوانی دارد، اما چهارمی یک x است
81
00:02:58,319 –> 00:03:01,280
زمانی که ما واقعاً یک کاراکتر می خواهیم، بنابراین او
82
00:03:01,280 –> 00:03:03,280
، این کار نمی کند و ما مجبور شدیم در وا
83
00:03:03,280 –> 00:03:05,599
ع از آن عبور کنیم. کل سوزن
84
00:03:05,599 –> 00:03:07,519
فقط برای اینکه بفهمیم آخرین کاراکتر
85
00:03:07,519 –> 00:03:10,159
با هم مطابقت ندارد بسیار آزاردهنده است و در
86
00:03:10,159 –> 00:03:11,920
مرحله بعدی این چهار
87
00:03:11,920 –> 00:03:13,599
کاراکتر را بررسی می کنیم در این مورد
88
00:03:13,599 –> 00:03:16,080
دو کاراکتر اول را بررسی می کنیم و
89
00:03:16,080 –> 00:03:18,400
متوجه می شویم که شخصیت سوم مطابقت ندارد. مطابقت دارد
90
00:03:18,400 –> 00:03:20,480
و این نوعی تم این
91
00:03:20,480 –> 00:03:22,319
دو رشته است، ما
92
00:03:22,319 –> 00:03:24,239
اینجا را بررسی می کنیم، خیلی بد نیست، فقط باید
93
00:03:24,239 –> 00:03:25,920
اولین کاراکتر را بررسی کنیم که
94
00:03:25,920 –> 00:03:27,760
مطابقت دارد، اما بعد دومی
95
00:03:27,760 –> 00:03:29,680
با بعدی مطابقت ندارد، این را بررسی می کنیم بسیار خوب است.
96
00:03:29,680 –> 00:03:31,280
با x مطابقت
97
00:03:31,280 –> 00:03:33,920
ندارد، خیلی بد نیست، اما پس از
98
00:03:33,920 –> 00:03:35,200
آن، همان کاری را میکنیم که در
99
00:03:35,200 –> 00:03:36,879
ابتدا انجام دادیم، باید هر
100
00:03:36,879 –> 00:03:39,120
سه کاراکتر را بررسی کنیم تا بررسی کنیم که شخصیت
101
00:03:39,120 –> 00:03:41,920
چهارم درست مطابقت ندارد.
102
00:03:41,920 –> 00:03:43,680
این یک نمونه است که و پیچیدگی زمانی
103
00:03:43,680 –> 00:03:45,519
در واقع زمان اجرا در واقع بسیار
104
00:03:45,519 –> 00:03:48,959
بد است، حدود n برابر m است و الگوریتم kmp
105
00:03:48,959 –> 00:03:51,519
در واقع می تواند این
106
00:03:51,519 –> 00:03:53,360
مشکل را برای ما حل کند، این اطمینان حاصل می کند که
107
00:03:53,360 –> 00:03:56,000
زمان اجرا در بدترین حالت n
108
00:03:56,000 –> 00:03:56,959
به اضافه
109
00:03:56,959 –> 00:03:59,599
m خواهد بود. نکته منفی این است که بسیار بسیار
110
00:03:59,599 –> 00:04:01,920
پیچیده است. اما من سعی خواهم کرد آن را به گونه ای توضیح
111
00:04:01,920 –> 00:04:03,760
دهم که شما مجبور نباشید
112
00:04:03,760 –> 00:04:05,599
بسیاری از جزئیات را به خاطر بسپارید و بتوانید
113
00:04:05,599 –> 00:04:08,879
به شهود خود اجازه دهید شما را به
114
00:04:08,879 –> 00:04:11,599
راه حل راهنمایی کند، بنابراین ایده اصلی این است
115
00:04:11,599 –> 00:04:13,599
که چند کار تکراری را حذف کنید. با انجام چند
116
00:04:13,599 –> 00:04:16,798
پیش پردازش، دیدیم
117
00:04:16,798 –> 00:04:19,120
که ابتدا چهار کاراکتر اول
118
00:04:19,120 –> 00:04:20,959
هر کدام از آنها را مقایسه کردیم، سه کاراکتر
119
00:04:20,959 –> 00:04:22,800
اول مطابقت داشتند، اما سپس به کاراکتر چهارم رسیدیم
120
00:04:22,800 –> 00:04:26,080
که درست مطابقت نداشت و
121
00:04:26,080 –> 00:04:28,880
سپس مجبور شدیم همه چیز را از اول شروع کنیم.
122
00:04:28,880 –> 00:04:32,400
ما باید اینها را با سوزن خود مقایسه می
123
00:04:32,400 –> 00:04:35,040
کردیم و باید از اولین
124
00:04:35,040 –> 00:04:38,240
کاراکتر این رشته فرعی شروع می کردیم،
125
00:04:38,240 –> 00:04:39,919
باید به ابتدای سوزن خود بازگردیم
126
00:04:39,919 –> 00:04:43,440
و اوه اینجا، اما آیا این واقعاً
127
00:04:43,440 –> 00:04:46,160
ضروری است زیرا به یاد داشته باشید که این
128
00:04:46,160 –> 00:04:48,320
کاراکتر بود که در واقع نشان داد مشکل ما
129
00:04:48,320 –> 00:04:50,639
این بود که کاراکتر x بود که این کاراکترها
130
00:04:50,639 –> 00:04:53,199
کاملاً خوب بودند و نه تنها
131
00:04:53,199 –> 00:04:55,199
این کاراکترها خوب بودند، این کاراکترها
132
00:04:55,199 –> 00:04:58,560
در واقع هنوز هم با ابتدای سوزن ما مطابقت دارند،
133
00:04:58,560 –> 00:05:02,400
این پیشوند با این پیشوند مطابقت دارد،
134
00:05:02,400 –> 00:05:04,800
پس چرا باید
135
00:05:04,800 –> 00:05:06,960
دوباره این کاراکترها را در
136
00:05:06,960 –> 00:05:09,600
واقعیت نشانگر خود مرور کنیم. در انبار کاه
137
00:05:09,600 –> 00:05:12,000
هنوز هم باید در نویسه x باشد که
138
00:05:12,000 –> 00:05:14,720
در جایی که عدم تطابق را پیدا کردیم متوقف شدیم
139
00:05:14,720 –> 00:05:17,520
و نشانگر ما در سوزن باید
140
00:05:17,520 –> 00:05:19,600
در اینجا تمام شود زیرا دو مورد اول قبلاً
141
00:05:19,600 –> 00:05:22,960
با این مطابقت دارند ممکن است به نحوی هوشمندانه
142
00:05:22,960 –> 00:05:25,919
مجبور نباشیم دوباره این کار تکراری را انجام دهیم
143
00:05:25,919 –> 00:05:27,759
و بله راهی وجود دارد که هدف اصلی
144
00:05:27,759 –> 00:05:30,240
الگوریتم kmp است و اولین
145
00:05:30,240 –> 00:05:32,320
بخش از این الگوریتم kmp در
146
00:05:32,320 –> 00:05:34,880
واقع
147
00:05:34,880 –> 00:05:38,080
طولانیترین قسمت پسوند پیشوند نامیده میشود، اجازه دهید
148
00:05:38,080 –> 00:05:40,960
فعلاً آن را lps بنامیم، اما
149
00:05:40,960 –> 00:05:44,080
اساساً به پیشوندها و پسوندها مربوط میشود.
150
00:05:44,080 –> 00:05:46,160
رشته ها می
151
00:05:46,160 –> 00:05:48,800
خواهیم به طولانی ترین پیشوند آن
152
00:05:48,800 –> 00:05:52,560
رشته که پسوند آن
153
00:05:52,560 –> 00:05:54,960
رشته فرعی نیز هست نگاهی بیندازیم و خواهید دید که چرا این رشته می
154
00:05:54,960 –> 00:05:56,720
شود o واقعاً مفید باشید اساساً
155
00:05:56,720 –> 00:05:58,400
این چیزی است که به ما امکان می دهد تا به
156
00:05:58,400 –> 00:06:01,919
نحوی هوشمندانه این پیشوند را بگیریم
157
00:06:01,919 –> 00:06:04,479
و از قبل بدانیم که لازم نیست
158
00:06:04,479 –> 00:06:06,400
دوباره این پیشوند را بخوانیم زیرا
159
00:06:06,400 –> 00:06:08,560
قبلاً با بخشی از
160
00:06:08,560 –> 00:06:10,319
انبار کاه مطابقت دارد و ما مجبور نیستیم آن را مرور
161
00:06:10,319 –> 00:06:13,520
کنیم. مجدداً برای خود سوزن
162
00:06:13,520 –> 00:06:15,199
الگوی درست است که ما سعی می کنیم
163
00:06:15,199 –> 00:06:17,759
در رشته بزرگتر پیدا کنیم، این همان چیزی است
164
00:06:17,759 –> 00:06:20,800
که می خواهیم آرایه lps را ایجاد کنیم،
165
00:06:20,800 –> 00:06:22,560
زیرا آرایه ای است که
166
00:06:22,560 –> 00:06:26,160
دقیقاً به اندازه سوزن خواهد بود که هر
167
00:06:26,160 –> 00:06:28,960
شاخص این
168
00:06:28,960 –> 00:06:30,960
نشان دهنده خواهد بود که مطابقت دارد، به عنوان مثال
169
00:06:30,960 –> 00:06:33,280
موقعیت اول lps
170
00:06:33,280 –> 00:06:36,000
با این زیر رشته مطابقت دارد،
171
00:06:36,000 –> 00:06:36,960
دومین
172
00:06:36,960 –> 00:06:39,199
شاخص lps با
173
00:06:39,199 –> 00:06:40,960
این زیررشته مطابقت دارد، سومین موقعیت
174
00:06:40,960 –> 00:06:42,639
با این و چهارمین
175
00:06:42,639 –> 00:06:44,319
با این مطابقت دارد، بنابراین
176
00:06:44,319 –> 00:06:47,600
اساساً تک تک پیشوندهای سوزن، بنابراین
177
00:06:47,600 –> 00:06:49,599
این بخش زیر رشته ما است و برای
178
00:06:49,599 –> 00:06:52,240
رشته فرعی ما می خواهیم چیزی
179
00:06:52,240 –> 00:06:54,479
در مورد آن بدانیم، می خواهیم
180
00:06:54,479 –> 00:06:57,680
طول طولانی ترین پیشوند را بدانیم. این
181
00:06:57,680 –> 00:07:00,639
زیر رشته کوچک در اینجا که
182
00:07:00,639 –> 00:07:03,840
اتفاقاً یک پسوند برای یک رشته نیز هست،
183
00:07:03,840 –> 00:07:05,599
بیایید بگوییم این رشته ماست یک
184
00:07:05,599 –> 00:07:08,479
پیشوند است که هر زیررشته از
185
00:07:08,479 –> 00:07:11,280
ابتدا شروع می شود، بنابراین این یک پیشوند است
186
00:07:11,280 –> 00:07:12,960
درست اولین کاراکتر، دو
187
00:07:12,960 –> 00:07:15,360
کاراکتر اول یک پیشوند است. پیشوند سه
188
00:07:15,360 –> 00:07:18,000
کاراکتر اول نیز یک پیشوند است و به
189
00:07:18,000 –> 00:07:21,759
هر حال یک پسوند اساساً مخالف
190
00:07:21,759 –> 00:07:24,000
هر زیر رشته ای است که به آخرین کاراکتر ختم می شود،
191
00:07:24,000 –> 00:07:26,800
بنابراین این آخرین کاراکتر یک
192
00:07:26,800 –> 00:07:29,039
پسوند است، دو کاراکتر آخر یک
193
00:07:29,039 –> 00:07:31,759
پسوند هستند و هر سه کاراکتر یک
194
00:07:31,759 –> 00:07:35,199
پسوند هستند. ما میخواهیم برای این
195
00:07:35,199 –> 00:07:37,520
زیررشته کوچک تنها با یک الف
196
00:07:37,520 –> 00:07:38,960
بدانیم طولانیترین
197
00:07:38,960 –> 00:07:41,199
پیشوند چیست که یک پسوند نیز هست،
198
00:07:41,199 –> 00:07:44,639
خود رشته a یک پیشوند و یک پسوند
199
00:07:44,639 –> 00:07:46,960
درست است، بنابراین آیا میتوانیم طول آن را در نظر
200
00:07:46,960 –> 00:07:49,120
بگیریم و برای موقعیت اول یکی بگوییم.
201
00:07:49,120 –> 00:07:51,759
خوب نه دقیقاً به این دلیل که من به
202
00:07:51,759 –> 00:07:54,080
نوعی دروغ گفتم ما فقط به دنبال
203
00:07:54,080 –> 00:07:56,479
طولانی ترین پیشوند نیستیم که یک پسوند نیز باشد، بلکه یک نکته
204
00:07:56,479 –> 00:07:59,039
وجود دارد و
205
00:07:59,039 –> 00:08:02,479
خود پیشوند نمی تواند کل رشته
206
00:08:02,479 –> 00:08:05,599
باشد، بنابراین در این مورد می توانیم
207
00:08:05,599 –> 00:08:08,080
در اینجا یک عدد قرار ندهید، باید یک عدد صفر قرار دهیم،
208
00:08:08,080 –> 00:08:10,319
زیرا کل رشته نمی
209
00:08:10,319 –> 00:08:12,160
تواند یکی از پیشوندها باشد و ما فقط
210
00:08:12,160 –> 00:08:14,639
یک رشته به طول یک داریم، بنابراین اساساً چیزی که
211
00:08:14,639 –> 00:08:16,720
ما متوجه شدیم موقعیت
212
00:08:16,720 –> 00:08:20,879
اول ما است. lps همیشه
213
00:08:20,879 –> 00:08:23,039
صفر خواهد بود، موقعیت بعدی جایی است که چیزها
214
00:08:23,039 –> 00:08:24,639
کمی جالب می شوند، بنابراین اکنون
215
00:08:24,639 –> 00:08:26,720
رشته فرعی که ما به آن نگاه می کنیم
216
00:08:26,720 –> 00:08:28,400
دو کاراکتر اول است زیرا این
217
00:08:28,400 –> 00:08:30,319
موقعیتی است که ما در آن قرار داریم، پس
218
00:08:30,319 –> 00:08:32,479
طولانی ترین پیشوند این چیست؟ همچنین یک
219
00:08:32,479 –> 00:08:34,880
پسوند به جز کل رشته،
220
00:08:34,880 –> 00:08:36,958
کاراکتر اول همان کاراکتر آخر
221
00:08:36,958 –> 00:08:39,760
است، بنابراین میتوانیم بگوییم یک و موقعیت بعدی
222
00:08:39,760 –> 00:08:41,760
در این مثال بسیار ساده است،
223
00:08:41,760 –> 00:08:43,360
بنابراین ما میخواهیم به این
224
00:08:43,360 –> 00:08:44,640
زیر رشته که سه
225
00:08:44,640 –> 00:08:45,839
کاراکتر اول است نگاه کنیم. ما در
226
00:08:45,839 –> 00:08:48,000
جایگاه سوم lps خود هستیم، پس
227
00:08:48,000 –> 00:08:50,000
طولانی ترین پیشوند چیست که یک پسوند است،
228
00:08:50,000 –> 00:08:51,600
خوب دو کاراکتر اول درست دو کاراکتر اول با
229
00:08:51,600 –> 00:08:53,519
دو کاراکتر آخر مطابقت دارند،
230
00:08:53,519 –> 00:08:56,000
بنابراین می توانیم مقدار
231
00:08:56,000 –> 00:08:58,399
دو را در اینجا قرار دهیم و سپس وقتی در آخرین
232
00:08:58,399 –> 00:08:59,680
موقعیت ما دوباره به هر چهار
233
00:08:59,680 –> 00:09:02,000
کاراکتر نگاه میکنیم که سه کاراکتر اول با سه کاراکتر قبلی مطابقت دارند،
234
00:09:02,000 –> 00:09:04,800
بنابراین میتوانیم سه کاراکتر را در این
235
00:09:04,800 –> 00:09:06,800
موقعیت قرار دهیم، البته هنوز کار
236
00:09:06,800 –> 00:09:08,800
با الگوریتم کاملاً تمام نشده است، اما
237
00:09:08,800 –> 00:09:10,240
به نوعی درک درستی از قسمت اول داریم
238
00:09:10,240 –> 00:09:12,640
که طولانیترین lps است.
239
00:09:12,640 –> 00:09:14,640
قسمت پسوند پیشوند، بنابراین کاری که من
240
00:09:14,640 –> 00:09:16,320
برای اولین بار در تاریخچه کد منظم انجام خواهم داد
241
00:09:16,320 –> 00:09:18,640
، در واقع دو صفحه نمایش است، بنابراین
242
00:09:18,640 –> 00:09:19,680
اکنون در واقع
243
00:09:19,680 –> 00:09:21,839
کد را همزمان با نگاه کردن به
244
00:09:21,839 –> 00:09:24,320
نقاشی انجام می دهیم زیرا این کامپیوتر
245
00:09:24,320 –> 00:09:26,320
مشکل خیلی پیچیده است، فکر
246
00:09:26,320 –> 00:09:28,399
می کنم واقعا برای ما مفید خواهد بود، بنابراین اولین
247
00:09:28,399 –> 00:09:29,920
کاری که می خواهم انجام دهم این است که فقط برای
248
00:09:29,920 –> 00:09:32,160
زمینه خود مشکل کد نشت،
249
00:09:32,160 –> 00:09:33,600
اگر سوزن یک
250
00:09:33,600 –> 00:09:36,720
رشته خالی باشد، باید صفر را برگردانیم و گفتن آن را به صفر برگردانیم.
251
00:09:36,720 –> 00:09:38,959
که اولین شاخص تطبیقی که پی
252
00:09:38,959 –> 00:09:41,600
ا کردیم در شاخص صفر بود، اما اکنون می
253
00:09:41,600 –> 00:09:43,760
توانیم به قسمت lps برسیم، بنابراین در
254
00:09:43,760 –> 00:09:46,399
بتدا یک آرایه lps ایجاد میکنیم، اجازه دهید آن
255
00:09:46,399 –> 00:09:48,240
ا روی تمام صفرها تنظیم کنیم و آن را به
256
00:09:48,240 –> 00:09:51,040
ندازه آرایه سوزنی خود تنظیم کن
257
00:09:51,040 –> 00:09:53,279
م. چون lps همیشه goi است ng
258
00:09:53,279 –> 00:09:55,680
به اندازه سوزن باشد، خوب است، بنابراین
259
00:09:55,680 –> 00:09:57,519
اکنون ما در واقع از دو
260
00:09:57,519 –> 00:09:59,760
نشانگر برای این مشکل استفاده می کنیم،
261
00:09:59,760 –> 00:10:03,200
از نشانگر lps قبلی استفاده می
262
00:10:03,200 –> 00:10:05,279
کنیم که اساساً طول پسوند فرعی طولانی ترین پیشوند قبلی را به ما می گوید.
263
00:10:05,279 –> 00:10:08,079
264
00:10:08,079 –> 00:10:10,560
اوه یک عبارت بسیار پیچیده است و
265
00:10:10,560 –> 00:10:11,680
زمانی که ما یک
266
00:10:11,680 –> 00:10:13,200
اشاره گر دوم نیز داشته باشیم که
267
00:10:13,200 –> 00:10:14,720
شخصیت فعلی مورد نظر ما خواهد بود، بنابراین در
268
00:10:14,720 –> 00:10:16,720
269
00:10:16,720 –> 00:10:19,040
اصل lps قبلی صفر خواهد بود و
270
00:10:19,040 –> 00:10:21,760
من یکی می شوم. دلیل اینکه ما این را می
271
00:10:21,760 –> 00:10:24,160
گوییم این است که به یاد داشته باشید در این
272
00:10:24,160 –> 00:10:26,079
موقعیت سمت راست همیشه یک
273
00:10:26,079 –> 00:10:28,560
سمت راست صفر خواهد بود، به همین دلیل است که lps قبلی
274
00:10:28,560 –> 00:10:31,120
صفر است و نشانگر i ما در واقع
275
00:10:31,120 –> 00:10:35,040
از یک در این شاخص شروع می شود،
276
00:10:35,040 –> 00:10:36,720
حتی اگر این مقدار باشد.
277
00:10:36,720 –> 00:10:39,200
یک شاخص این نیز یکی است به
278
00:10:39,200 –> 00:10:41,519
همین دلیل است که نشانگر i ما روی این موقعیت تنظیم شده است،
279
00:10:41,519 –> 00:10:43,839
اما ما هنوز این
280
00:10:43,839 –> 00:10:46,240
مقدار را کاملاً مشخص نکردهایم، بنابراین اجازه دهید در واقع
281
00:10:46,240 –> 00:10:49,440
این مورد را به صفر بازنشانی کنیم، بنابراین اکنون میتوانیم
282
00:10:49,440 –> 00:10:51,680
بقیه موارد را به عنوان پر کنیم. ما می رویم و
283
00:10:51,680 –> 00:10:53,200
در واقع بیایید کارهای بیشتری انجام دهیم
284
00:10:53,200 –> 00:10:55,680
مثال جالبی است، بنابراین این در
285
00:10:55,680 –> 00:10:57,519
واقع مثالی است که ما قصد داریم به آن نگاه
286
00:10:57,519 –> 00:10:59,600
کنیم، ما یک کاراکتر c را معرفی می کنیم زیرا
287
00:10:59,600 –> 00:11:00,959
می خواهید ببینید که چرا این
288
00:11:00,959 –> 00:11:02,560
کار این کار را بسیار جالب تر و
289
00:11:02,560 –> 00:11:04,640
همچنین بسیار دشوارتر می کند، نگویید من انجام دادم.
290
00:11:04,640 –> 00:11:07,760
با این الگوریتم kmp به شما هشدار نمی
291
00:11:07,760 –> 00:11:09,680
دهم که بسیار پیچیده است، بنابراین
292
00:11:09,680 –> 00:11:12,079
من i را برابر با i قرار می دهم، اما ما در واقع می
293
00:11:12,079 –> 00:11:14,399
خواهیم برابر با یک باشد، بنابراین درست
294
00:11:14,399 –> 00:11:17,440
lps قبلی ما صفر و
295
00:11:17,440 –> 00:11:19,279
نشانگر i ما در این
296
00:11:19,279 –> 00:11:22,480
شاخص قرار خواهد گرفت. به این کاراکتر نگاه می کنیم، بنابراین ما
297
00:11:22,480 –> 00:11:24,800
یک حلقه while درست انجام می دهیم در حالی که
298
00:11:24,800 –> 00:11:26,560
i کمتر از طول سوزن است،
299
00:11:26,560 –> 00:11:27,760
زیرا ما در حال بررسی هر
300
00:11:27,760 –> 00:11:30,079
کاراکتر در سوزن هستیم تا این
301
00:11:30,079 –> 00:11:33,839
آرایه lps را پر کنیم و بنابراین ساده ترین حالت
302
00:11:33,839 –> 00:11:36,720
انجام می شود. اگر کاراکترها با یکدیگر مطابقت داشته
303
00:11:36,720 –> 00:11:40,399
باشند، بنابراین اگر شاخص برنامه سوزنی i
304
00:11:40,399 –> 00:11:43,440
با سوزن در lps ایندکس قبلی برابر باشد،
305
00:11:43,440 –> 00:11:46,720
بنابراین در این صورت چه اتفاقی میافتد،
306
00:11:46,720 –> 00:11:51,040
ما lps i را
307
00:11:51,040 –> 00:11:52,639
برابر
308
00:11:52,639 –> 00:11:55,200
با lps قبلی
309
00:11:55,200 –> 00:11:58,560
به اضافه یک قرار میدهیم و
310
00:11:58,560 –> 00:12:01,760
اکنون lps قبلی را یک all r افزایش می دهیم درست است
311
00:12:01,760 –> 00:12:03,440
زیرا برای تکرار بعدی
312
00:12:03,440 –> 00:12:05,920
حلقه میخواهیم یک عدد افزایش یابد
313
00:12:05,920 –> 00:12:07,760
زیرا تازه متوجه شدیم که این
314
00:12:07,760 –> 00:12:09,519
کاراکترها برابر هستند، بنابراین
315
00:12:09,519 –> 00:12:12,399
lps فعلی را روی lps قبلی به اضافه یک تنظیم میکنیم،
316
00:12:12,399 –> 00:12:14,000
بنابراین مقدار در اینجا اساساً همان چیزی است
317
00:12:14,000 –> 00:12:16,959
که جایگزین میکنیم. lps با و
318
00:12:16,959 –> 00:12:17,839
البته
319
00:12:17,839 –> 00:12:20,160
ما میخواهیم اکنون این نشانگر i را بگیریم و
320
00:12:20,160 –> 00:12:23,040
به کاراکتر بعدی در نمایه سوم نگاه
321
00:12:23,040 –> 00:12:24,880
کنیم، بنابراین میخواهیم جلو برویم و بگوییم
322
00:12:24,880 –> 00:12:28,639
i به علاوه برابر با 1. حالا این سه
323
00:12:28,639 –> 00:12:30,880
خط کد در واقع نوعی هستند. پیچیده
324
00:12:30,880 –> 00:12:32,480
است بیایید این نقاشی را مرور کنیم
325
00:12:32,480 –> 00:12:34,399
و آنها را درک کنیم، بنابراین چگونه قرار
326
00:12:34,399 –> 00:12:36,639
است اول از همه خوب اجرا شود، ما
327
00:12:36,639 –> 00:12:38,160
این دو کاراکتر را درست lps قبلی مقایسه می کنیم
328
00:12:38,160 –> 00:12:40,480
، اینجا چشمان اینجا این دو
329
00:12:40,480 –> 00:12:42,800
شخصیت برابر هستند چه چیزی به
330
00:12:42,800 –> 00:12:45,360
ما می گوید که به ما می گوید که این
331
00:12:45,360 –> 00:12:48,000
پیشوند این پسوند است، زیرا آنها مساوی هستند،
332
00:12:48,000 –> 00:12:48,959
333
00:12:48,959 –> 00:12:50,880
ما این را می گیریم و آن را به
334
00:12:50,880 –> 00:12:53,600
عنوان یکی تنظیم می کنیم، اکنون چه اتفاقی می افتد در
335
00:12:53,600 –> 00:12:55,920
تکرار دوم حلقه که ما
336
00:12:55,920 –> 00:12:58,880
lps های قبلی را در این موقعیت قرار دادیم.
337
00:12:58,880 –> 00:13:02,000
و i را در t قرار دادیم موقعیت او درست است، ما
338
00:13:02,000 –> 00:13:03,760
هر دوی آنها را یک بار افزایش
339
00:13:03,760 –> 00:13:06,240
دادیم، اکنون به دنبال مقدار lps در این
340
00:13:06,240 –> 00:13:08,959
نقطه هستیم، بنابراین دوباره طبق الگوریتم خود
341
00:13:08,959 –> 00:13:10,800
در حال حاضر می خواهیم این
342
00:13:10,800 –> 00:13:14,480
دو کاراکتر را دوباره با هم مقایسه کنیم، پس
343
00:13:14,480 –> 00:13:16,880
چه چیزی قرار دهیم. در این نقطه
344
00:13:16,880 –> 00:13:20,079
ما میخواهیم الپیهای قبلی را برداریم و
345
00:13:20,079 –> 00:13:22,720
یکی به آن اضافه کنیم، بنابراین در نهایت
346
00:13:22,720 –> 00:13:25,600
دو تا را در اینجا قرار میدهیم که منطقی است
347
00:13:25,600 –> 00:13:27,680
این دو کاراکتر برابر با این
348
00:13:27,680 –> 00:13:30,320
دو کاراکتر هستند، بنابراین دو مقدار مناسبی است
349
00:13:30,320 –> 00:13:32,399
که باید در اینجا قرار دهیم. چون به یاد داشته باشید که
350
00:13:32,399 –> 00:13:35,600
نمیتوانیم کل رشته را به عنوان پیشوند استفاده کنیم، اما
351
00:13:35,600 –> 00:13:38,320
چگونه به طرز جادویی کار کرد چرا
352
00:13:38,320 –> 00:13:41,760
مقدار lps قبلی را به اضافه یک چاه اضافه میکنیم،
353
00:13:41,760 –> 00:13:44,000
که بخش کمی دشوار است،
354
00:13:44,000 –> 00:13:46,320
اجازه دهید قبل از هر چیز توضیح
355
00:13:46,320 –> 00:13:48,639
دهیم که مقدار lps در اینجا است.
356
00:13:48,639 –> 00:13:51,279
برابر با 1 چیزی که ما در واقع تعیین
357
00:13:51,279 –> 00:13:54,560
کردیم این بود که این کاراکتر این پیشوند
358
00:13:54,560 –> 00:13:56,399
برابر با این
359
00:13:56,399 –> 00:13:58,880
پسوند است.
360
00:13:58,880 –> 00:14:01,760
361
00:14:01,760 –> 00:14:04,959
362
00:14:04,959 –> 00:14:07,279
363
00:14:07,279 –> 00:14:09,360
رفتن g از طریق اولین کاراکتر uh
364
00:14:09,360 –> 00:14:11,360
تنظیمات بررسی می کنیم که آیا برابر با این کاراکتر و
365
00:14:11,360 –> 00:14:12,800
غیره درست است، ما در
366
00:14:12,800 –> 00:14:14,320
ابتدا تمام راه را شروع
367
00:14:14,320 –> 00:14:16,880
نمی کنیم زیرا به یاد داشته باشید که مقدار lps قبلی ما
368
00:14:16,880 –> 00:14:20,240
چیزی است که به ما می گوید که این کاراکتر
369
00:14:20,240 –> 00:14:23,440
قبلاً با این کاراکتر مطابقت دارد بنابراین
370
00:14:23,440 –> 00:14:25,760
ما نمی کنیم. حتی باید این یکی را بررسی کنیم
371
00:14:25,760 –> 00:14:29,360
زیرا اگر این مقدار را مقایسه کنیم و
372
00:14:29,360 –> 00:14:32,560
اتفاقاً با این مقدار برابر است، از
373
00:14:32,560 –> 00:14:35,360
قبل میدانیم که با آن مطابقت دارد،
374
00:14:35,360 –> 00:14:37,920
بنابراین اگر با این مطابقت داشت،
375
00:14:37,920 –> 00:14:40,480
میتوانیم فقط طول lps قبلی را بگیریم
376
00:14:40,480 –> 00:14:43,760
و یک را به آن اضافه کنیم. درست است و
377
00:14:43,760 –> 00:14:46,079
این واقعاً پیچیده به نظر می رسد، شاید
378
00:14:46,079 –> 00:14:47,600
شما راه آسان تری برای پیاده سازی آن
379
00:14:47,600 –> 00:14:49,680
داشته باشید، اما به یاد داشته باشید که هدف ما این است که
380
00:14:49,680 –> 00:14:53,199
پیچیدگی زمانی را n به اضافه m نگه داریم، بنابراین
381
00:14:53,199 –> 00:14:55,680
باید بتوانیم این الگوریتم lps سوزنی
382
00:14:55,680 –> 00:14:57,440
را در
383
00:14:57,440 –> 00:14:59,760
مدت زمان کمی از n انجام دهیم. جایی که فرض کنید n
384
00:14:59,760 –> 00:15:01,199
طول این است و در واقع من
385
00:15:01,199 –> 00:15:04,000
m را به طول سوزن ارجاع می
386
00:15:04,000 –> 00:15:06,959
دهم، بنابراین اساساً به همین دلیل است که
387
00:15:06,959 –> 00:15:10,399
از شاخص lps قبلی یا
388
00:15:10,399 –> 00:15:12,720
مقدار lps قبلی استفاده می کنیم تا به ما بگوییم چه شاخصی را
389
00:15:12,720 –> 00:15:14,639
com کنیم. آن را مقایسه کنید زیرا اگر این یکی از این موارد است
390
00:15:14,639 –> 00:15:16,240
که به این معنی است که اولین
391
00:15:16,240 –> 00:15:18,399
کاراکتر با آن مطابقت دارد، بنابراین
392
00:15:18,399 –> 00:15:20,160
پیچیده است، اما اجازه دهید به سرعت
393
00:15:20,160 –> 00:15:22,000
بقیه این مثال را مرور کنیم، زیرا
394
00:15:22,000 –> 00:15:23,680
قرار است کمی
395
00:15:23,680 –> 00:15:27,199
پیچیدهتر شود، زیرا اکنون
396
00:15:27,199 –> 00:15:29,360
ما lps قبلی خود را خواهیم داشت. اشاره گر
397
00:15:29,360 –> 00:15:31,839
اینجا باشد و اشاره گر چشمی ما
398
00:15:31,839 –> 00:15:33,600
اینجا باشد و این
399
00:15:33,600 –> 00:15:34,959
اولین باری است که در واقع می بینیم که
400
00:15:34,959 –> 00:15:37,040
این دو کاراکتر به وضوح با یکدیگر مطابقت ندارند،
401
00:15:37,040 –> 00:15:39,759
ما باید
402
00:15:39,759 –> 00:15:42,240
کد خود را برای مقابله با این موضوع تطبیق دهیم زیرا
403
00:15:42,240 –> 00:15:43,920
در حال حاضر ما فقط موردی داریم که
404
00:15:43,920 –> 00:15:46,320
آنها با یکدیگر مطابقت داشته باشند و در این
405
00:15:46,320 –> 00:15:48,800
حالت دیگر یک
406
00:15:48,800 –> 00:15:50,959
شرطی دیگر خواهیم داشت و اگر
407
00:15:50,959 –> 00:15:54,639
lps قبلی برابر با صفر باشد uh و
408
00:15:54,639 –> 00:15:56,399
شرط دیگری که برابر با
409
00:15:56,399 –> 00:15:58,240
صفر نباشد، خواهد بود.
410
00:15:58,240 –> 00:16:00,079
کمی متفاوت خواهد بود زیرا همانطور که من در
411
00:16:00,079 –> 00:16:02,639
مورد این موقعیت درست صحبت می کردم، بنابراین می
412
00:16:02,639 –> 00:16:05,040
دانیم که ال پی های قبلی دو است،
413
00:16:05,040 –> 00:16:07,759
یعنی از قبل می دانیم که این با این
414
00:16:07,759 –> 00:16:09,680
دو شخصیت مطابقت دارد، بنابراین ما فقط باید
415
00:16:09,680 –> 00:16:11,199
این دو را با هم مقایسه کنیم و بررسی کنیم که
416
00:16:11,199 –> 00:16:13,600
اگر مساوی هستند یا خیر، میتوانیم این
417
00:16:13,600 –> 00:16:16,079
مقدار را دو بگیریم و یک را به آن اضافه کنیم و آن را روی
418
00:16:16,079 –> 00:16:17,680
سه قرار دهیم، اما وقتی مساوی نباشند چه اتفاقی میافتد که در حال حاضر همینطور است.
419
00:16:17,680 –> 00:16:19,839
420
00:16:19,839 –> 00:16:21,839
421
00:16:21,839 –> 00:16:24,160
بیایید حالت اول خود را در نظر بگیریم اگر lps قبلی در
422
00:16:24,160 –> 00:16:26,399
واقع برابر با صفر بود زیرا در حال حاضر
423
00:16:26,399 –> 00:16:28,959
lps قبلی ما برابر با دو است، اما
424
00:16:28,959 –> 00:16:30,959
بیایید یک مثال متفاوت را در نظر بگیریم،
425
00:16:30,959 –> 00:16:32,959
بیایید این را واقعاً
426
00:16:32,959 –> 00:16:34,800
خیلی سریع تغییر دهیم، بنابراین اجازه دهید یک
427
00:16:34,800 –> 00:16:37,199
مثال متفاوت را برای یک ثانیه سریع در نظر بگیریم.
428
00:16:37,199 –> 00:16:38,880
فرض کنید داریم lps این کار را انجام می دهیم، می
429
00:16:38,880 –> 00:16:40,240
دانیم که مقدار اول همیشه
430
00:16:40,240 –> 00:16:42,079
صفر خواهد بود، بنابراین در حال حاضر
431
00:16:42,079 –> 00:16:43,759
این کاراکتر را با این کاراکتر مقایسه
432
00:16:43,759 –> 00:16:46,160
می کنیم، آیا این کاراکترها برابر
433
00:16:46,160 –> 00:16:48,320
هستند، نه، بنابراین ما مورد دیگر خود را درست انجام می دهیم
434
00:16:48,320 –> 00:16:50,240
و ما نگاه می کنیم اگر lps قبلی
435
00:16:50,240 –> 00:16:52,000
برابر با صفر باشد، به این معنی که
436
00:16:52,000 –> 00:16:54,480
هرگز پیشوندی از این رشته وجود نداشته است که
437
00:16:54,480 –> 00:16:57,360
با پسوند رشته مطابقت داشته باشد، بنابراین
438
00:16:57,360 –> 00:16:59,040
به ما می گوید که نشانگری که
439
00:16:59,040 –> 00:17:00,240
ما به آن نگاه می کنیم در واقع در
440
00:17:00,240 –> 00:17:01,920
ابتدا تا انتها در t است. او
441
00:17:01,920 –> 00:17:03,839
ابتدای رشته اگر حتی اولین
442
00:17:03,839 –> 00:17:06,319
کاراکتر با آخرین کاراکتر شما مطابقت نداشته
443
00:17:06,319 –> 00:17:08,079
باشد، به این معنی است که
444
00:17:08,079 –> 00:17:10,720
احتمالاً نمیتوانیم پیشوندی داشته
445
00:17:10,720 –> 00:17:12,799
باشیم که با یک پسوند درست مطابقت داشته باشد،
446
00:17:12,799 –> 00:17:14,880
بنابراین میتوانیم فقط یک صفر در اینجا قرار
447
00:17:14,880 –> 00:17:17,039
دهیم. در حالت ساده می گوییم
448
00:17:17,039 –> 00:17:19,919
که اگر یک lps قبلی روی 0 باشد،
449
00:17:19,919 –> 00:17:24,319
می توانیم lps i را برابر با 0 قرار دهیم
450
00:17:24,319 –> 00:17:26,640
و همچنین فراموش نکنیم که
451
00:17:26,640 –> 00:17:28,400
نشانگر i خود را افزایش دهیم زیرا نمی خواهیم
452
00:17:28,400 –> 00:17:30,559
در یک حلقه بی نهایت گیر کنیم. ما در
453
00:17:30,559 –> 00:17:32,480
اینجا lps قبلی خود را داریم، این
454
00:17:32,480 –> 00:17:34,559
همان چیزی است که من از p برای اشاره
455
00:17:34,559 –> 00:17:37,280
به آن استفاده می کنم. من در اینجا کاراکترها با
456
00:17:37,280 –> 00:17:39,919
هم مطابقت ندارند و lps قبلی
457
00:17:39,919 –> 00:17:42,320
برابر با صفر نیست. lps قبلی ما
458
00:17:42,320 –> 00:17:43,840
در حال حاضر برابر است با دو
459
00:17:43,840 –> 00:17:47,039
دستور else این
460
00:17:47,039 –> 00:17:48,640
الگوریتم را اجرا خواهیم کرد و در واقع
461
00:17:48,640 –> 00:17:50,480
معنی ندارد این شرط دیگر
462
00:17:50,480 –> 00:17:52,320
برای این بخش معنی ندارد، اما
463
00:17:52,320 –> 00:17:53,280
زمانی که ما
464
00:17:53,280 –> 00:17:55,600
واقعاً این مثال را به پایان برسانیم منطقی خواهد بود، بنابراین به یاد داشته باشید
465
00:17:55,600 –> 00:17:57,679
که این 2 به ما چه می گوید این است که
466
00:17:57,679 –> 00:17:59,440
دو شخصیت اول مطابقت دارند دو
467
00:17:59,440 –> 00:18:01,440
کاراکتر آخر زمانی که ما اینجا
468
00:18:01,440 –> 00:18:03,280
بودیم، بنابراین سعی میکنیم میانبری را انتخاب کنیم،
469
00:18:03,280 –> 00:18:05,440
میخواهیم بگوییم که اگر این شخصیت با این شخصیت مطابقت
470
00:18:05,440 –> 00:18:07,600
دارد، میتوانیم سه کاراکتر را در اینجا قرار دهیم،
471
00:18:07,600 –> 00:18:08,960
زیرا این به این معنی است که این سه شخصیت با
472
00:18:08,960 –> 00:18:11,200
این سه مطابقت دارند، اما اگر اینطور نیست.
473
00:18:11,200 –> 00:18:12,960
با هم مطابقت داشته باشند که به ما میگوید
474
00:18:12,960 –> 00:18:15,440
طولانیترین پسوند این نقطه
475
00:18:15,440 –> 00:18:17,760
نمیتواند سه باشد، این چیزی است
476
00:18:17,760 –> 00:18:20,000
که میخواستیم بررسی کنیم آیا سه درست است، ما
477
00:18:20,000 –> 00:18:21,679
از کار قبلی استفاده میکردیم که
478
00:18:21,679 –> 00:18:24,000
قبلا انجام داده بودیم، اما اکنون میدانیم که نمیتواند باشد.
479
00:18:24,000 –> 00:18:26,880
سه اما شاید می تواند دو مقدار باشد
480
00:18:26,880 –> 00:18:29,120
درست چگونه می توانیم بررسی کنیم که آیا مقدار 2 است یا خیر،
481
00:18:29,120 –> 00:18:31,039
ما هنوز هم نشانگر i خود را
482
00:18:31,039 –> 00:18:32,640
اینجا می گذاریم زیرا ما سعی می کنیم
483
00:18:32,640 –> 00:18:35,280
این نقطه را پر کنیم اما نشانگر p ما
484
00:18:35,280 –> 00:18:38,080
که اکنون اینجا بود قرار است
485
00:18:38,080 –> 00:18:41,039
به هر مقداری که اتفاقاً
486
00:18:41,039 –> 00:18:43,840
به سمت چپ آن باشد منتقل میشود، نه لزوماً
487
00:18:43,840 –> 00:18:46,160
با یک سمت راست کاهش
488
00:18:46,160 –> 00:18:47,760
مییابد، فقط آن را اینجا قرار میدهیم،
489
00:18:47