در این مطلب، ویدئو Iterator درخت جستجوی باینری – Leetcode 173 – Python با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 00:12:47
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:00,080 –> 00:00:01,760
سلام به همه خوش آمدید و بیایید
2
00:00:01,760 –> 00:00:03,600
امروز یک کد دقیق تر بنویسیم، بنابراین امروز
3
00:00:03,600 –> 00:00:06,000
بیایید مشکل
4
00:00:06,000 –> 00:00:08,080
5
00:00:08,080 –> 00:00:10,400
6
00:00:10,400 –> 00:00:12,639
تکرار کننده درخت جستجوی باینری
7
00:00:12,639 –> 00:00:14,880
را حل کنیم.
8
00:00:14,880 –> 00:00:16,720
9
00:00:16,720 –> 00:00:19,119
اگر قبلاً از یک درخت جستجوی دودویی استفاده کرده باشید، از یک درخت جستجوی دودویی انتظار
10
00:00:19,119 –> 00:00:20,720
دارید که قبلاً یک
11
00:00:20,720 –> 00:00:22,400
تکرار کننده واقعی مانند جاوا یا
12
00:00:22,400 –> 00:00:24,080
چیزی شبیه به آن می شناسید، زیرا
13
00:00:24,080 –> 00:00:25,680
این یکی از اهداف
14
00:00:25,680 –> 00:00:28,160
درخت جستجوی دودویی است که مقادیر را به
15
00:00:28,160 –> 00:00:30,400
نوعی مرتب شده داشته باشد. به معنای واقعی کلمه
16
00:00:30,400 –> 00:00:32,800
مرتب نشده است، اما به گونه ای است که می توانید
17
00:00:32,800 –> 00:00:34,640
آنها را به ترتیب مرتب شده تکرار کنید
18
00:00:34,640 –> 00:00:36,640
، واقعاً سه
19
00:00:36,640 –> 00:00:38,719
روش وجود دارد که می خواهیم پیاده سازی کنیم، یکی
20
00:00:38,719 –> 00:00:40,879
فقط سازنده است و سپس دو روش
21
00:00:40,879 –> 00:00:42,960
واقعی هستند که دارای برخی عملکردها هستند
22
00:00:42,960 –> 00:00:45,360
که باید انجام دهیم. is has next
23
00:00:45,360 –> 00:00:47,600
، اگر هنوز
24
00:00:47,600 –> 00:00:51,280
مقداری در تکرار کننده وجود داشته باشد که
25
00:00:51,280 –> 00:00:54,879
بتوانیم آن را برگردانیم، مقدار true را برمی گرداند، بنابراین فرض کنید این ورودی
26
00:00:54,879 –> 00:00:56,399
تکرار کننده قرار است از بین برود. تمام
27
00:00:56,399 –> 00:00:58,160
گره ها را به ترتیب به ترتیب انجام دهید، بنابراین ابتدا
28
00:00:58,160 –> 00:01:00,559
3 را انجام می دهد، سپس 7، سپس 9، سپس
29
00:01:00,559 –> 00:01:02,239
15 و سپس 20 را انجام می دهد و سپس
30
00:01:02,239 –> 00:01:04,959
درست بعد از هر پنج مقداری که در
31
00:01:04,959 –> 00:01:07,600
مرحله بعد دارد باید نادرست برگردد، زیرا
32
00:01:07,600 –> 00:01:11,040
وجود ندارد. هر مقداری که برای ما باقی مانده است تا
33
00:01:11,040 –> 00:01:13,280
مدتی برگردانیم هنوز مقادیری وجود دارد،
34
00:01:13,280 –> 00:01:14,560
اما پس از آن ما می خواهیم true را برگردانیم، اما
35
00:01:14,560 –> 00:01:16,240
در واقع
36
00:01:16,240 –> 00:01:18,960
خود مقدار را با تابع has next برمی گردانیم،
37
00:01:18,960 –> 00:01:21,280
اما تابع بعدی همان چیزی است که
38
00:01:21,280 –> 00:01:24,000
می خواهیم مقدار را به قدری
39
00:01:24,000 –> 00:01:25,840
یک راه حل بی اهمیت برای این مورد برگردانید
40
00:01:25,840 –> 00:01:27,840
که ممکن است به این فکر کنید که چرا
41
00:01:27,840 –> 00:01:30,560
فقط پیمایش نامتعارف را
42
00:01:30,560 –> 00:01:34,240
روی درخت اجرا نکنیم و هر مقدار را
43
00:01:34,240 –> 00:01:37,759
در داخل یک آرایه قرار دهیم و سپس
44
00:01:37,759 –> 00:01:39,920
بتوانیم مانند یک
45
00:01:39,920 –> 00:01:42,240
اشاره گر واحد در سمت راست حفظ کنیم. از اولین مقدار شروع کنید
46
00:01:42,240 –> 00:01:44,720
این را برگردانید و این را برگردانید این و
47
00:01:44,720 –> 00:01:46,240
غیره را درست تا زمانی که کار با
48
00:01:46,240 –> 00:01:48,399
آرایه تمام شود و سپس قبل از
49
00:01:48,399 –> 00:01:50,560
اجرای راه حل خوب هستیم، بیایید درک کنیم
50
00:01:50,560 –> 00:01:52,640
که چقدر کارآمد خواهد بود
51
00:01:52,640 –> 00:01:55,040
پیچیدگی کلی زمان بسیار خوب است از n
52
00:01:55,040 –> 00:01:57,680
ما ‘r e فقط روی کل
53
00:01:57,680 –> 00:01:59,840
آرایه تکرار می شود یا نه آرایه درخت و من
54
00:01:59,840 –> 00:02:02,159
حدس می زنم اگر بخواهیم می توانیم آن را در
55
00:02:02,159 –> 00:02:03,920
سازنده قرار دهیم تا
56
00:02:03,920 –> 00:02:08,080
سازنده از n زمان بد نباشد و سپس هر uh دارای
57
00:02:08,080 –> 00:02:09,038
58
00:02:09,038 –> 00:02:11,120
تابع بعدی و بعدی است. از آنها
59
00:02:11,120 –> 00:02:12,640
را میتوان در یک بار بزرگ o انجام داد،
60
00:02:12,640 –> 00:02:14,239
زیرا ما فقط
61
00:02:14,239 –> 00:02:17,120
یک اشاره گر را روی این آرایه افزایش میدهیم، اکنون
62
00:02:17,120 –> 00:02:19,520
پیچیدگی حافظه نیز به وضوح
63
00:02:19,520 –> 00:02:21,599
از n بزرگ است زیرا ما
64
00:02:21,599 –> 00:02:24,319
هر گره را در یک آرایه قرار میدهیم. و اگر
65
00:02:24,319 –> 00:02:26,560
قسمت پایینی
66
00:02:26,560 –> 00:02:29,120
این مشکل را به شما نشان دادم از ما میپرسند آیا
67
00:02:29,120 –> 00:02:32,080
میتوانیم بهتر انجام دهیم آیا واقعاً میتوانیم
68
00:02:32,080 –> 00:02:34,080
راهحلی را پیادهسازی کنیم که حافظه به
69
00:02:34,080 –> 00:02:35,599
اندازه درخت نباشد اما حافظه در
70
00:02:35,599 –> 00:02:38,080
واقع بزرگ باشد o از h که در آن h
71
00:02:38,080 –> 00:02:41,920
ارتفاع است. از درخت و آیا میتوانیم آن را طوری بسازیم
72
00:02:41,920 –> 00:02:44,879
که has next و next
73
00:02:44,879 –> 00:02:47,599
لزوماً یک o بزرگ از پیچیدگی یک زمان ندارند، اما
74
00:02:47,599 –> 00:02:48,840
آنها یک
75
00:02:48,840 –> 00:02:51,599
پیچیدگی زمانی متوسط دارند که اگ
76
00:02:51,599 –> 00:02:55,280
تابع has next و ne
77
00:02:55,280 –> 00:02:57,840
t را برای هر تک اجرا کنیم معنی ثابتی اس
78
00:02:57,840 –> 00:02:59,840
. گره در درخت چه چیزی
79
00:02:59,840 –> 00:03:02,319
بود میانگین پیچیدگی زمانی
80
00:03:02,319 –> 00:03:03,840
باید بزرگ یا بزرگ باشد، بنابراین این یک
81
00:03:03,840 –> 00:03:05,680
نوع محدودیت است، بنابراین می توانید ببینید که
82
00:03:05,680 –> 00:03:07,519
این یک نوع معاوضه است که ما
83
00:03:07,519 –> 00:03:10,319
پیچیدگی حافظه بهتر و
84
00:03:10,319 –> 00:03:12,159
پیچیدگی زمانی کمی بدتر می کنیم، زیرا این
85
00:03:12,159 –> 00:03:14,480
دیگر بزرگ نیست. این میانگین است، بنابراین
86
00:03:14,480 –> 00:03:16,239
چگونه میتوانیم این یک نوع راهحل کارآمدتر را پیادهسازی کنیم،
87
00:03:16,239 –> 00:03:18,159
88
00:03:18,159 –> 00:03:19,840
من به شما میگویم که چگونه، اما ابتدا اجازه دهید فقط
89
00:03:19,840 –> 00:03:21,440
چند تکنیک حل مسئله را به
90
00:03:21,440 –> 00:03:23,120
شما بگویم که اگر در اولین مورد گیر کردهاید، میتوانید از آنها استفاده کنید.
91
00:03:23,120 –> 00:03:24,879
همه اینها به
92
00:03:24,879 –> 00:03:27,280
وضوح یک مشکل درختی است و معمولاً
93
00:03:27,280 –> 00:03:29,120
راه حل
94
00:03:29,120 –> 00:03:30,799
برای مشکلات درخت همیشه پیمایش درخت است چه
95
00:03:30,799 –> 00:03:33,760
dfs یا bfs را می شناسید و
96
00:03:33,760 –> 00:03:36,799
البته این روش ها
97
00:03:36,799 –> 00:03:39,120
98
00:03:39,120 –> 00:03:41,440
قابل پیاده سازی هستند. به طور مکرر،
99
00:03:41,440 –> 00:03:43,360
بنابراین واقعاً گزینه های شما در اینجا هستند، شما
100
00:03:43,360 –> 00:03:45,040
باید سعی کنید ببینید کدام نوع
101
00:03:45,040 –> 00:03:47,760
راه حل تا حدودی برای
102
00:03:47,760 –> 00:03:49,920
این مشکل مؤثر است و اگر هیچ یک از اینها
103
00:03:49,920 –> 00:03:52,400
مؤثر نبود، ممکن است نوعی الگوریتم خاص وجود داشته باشد.
104
00:03:52,400 –> 00:03:55,200
ممکن است
105
00:03:55,200 –> 00:03:57,120
بدانید که برای حل این مشکل
106
00:03:57,120 –> 00:03:58,480
به الگوریتمی نیاز دارید که خودتان نمیتوانید
107
00:03:58,480 –> 00:04:00,640
صادق باشید و
108
00:04:00,640 –> 00:04:02,000
در این صورت به راهنمایی مصاحبهگر خود نیاز دارید،
109
00:04:02,000 –> 00:04:03,439
اما نکته خوب این است
110
00:04:03,439 –> 00:04:05,360
که ما به آن نیازی نداریم. یک الگوریتم خاص ما میتوانیم
111
00:04:05,360 –> 00:04:07,760
این کار را با یک پیمایش منظم به ترتیب انجام
112
00:04:07,760 –> 00:04:09,920
دهیم، اما ابتدا اجازه دهید معکوس بازگشتی را امتحان کنیم
113
00:04:09,920 –> 00:04:12,560
و سپس بفهمیم
114
00:04:12,560 –> 00:04:14,159
که چرا این کار نمیکند و سپس به
115
00:04:14,159 –> 00:04:16,399
شما نشان خواهم داد که چرا پیمایش تکراری
116
00:04:16,399 –> 00:04:18,160
کار میکند، بنابراین فرض کنید داریم انجام میدهیم. به
117
00:04:18,160 –> 00:04:20,399
صورت بازگشتی از ریشه شروع می کنیم و سعی می کنیم
118
00:04:20,399 –> 00:04:22,240
تا آنجا که می توانیم به سمت چپ برویم زیرا
119
00:04:22,240 –> 00:04:23,919
سعی می کنیم این کار را به ترتیب انجام دهیم بنابراین می
120
00:04:23,919 –> 00:04:26,400
دانید که از اینجا بازدید می کنیم سپس از اینجا بازدید می کنیم
121
00:04:26,400 –> 00:04:27,919
و سپس به سمت چپ ادامه می دهیم تا
122
00:04:27,919 –> 00:04:30,160
به اینجا برسیم که صفر است بنابراین ما میخواهیم در
123
00:04:30,160 –> 00:04:32,400
اینجا پشتیبانگیری کنیم و سپس بگوییم
124
00:04:32,400 –> 00:04:35,120
خوب این مقدار بازگشتی است، بنابراین برای
125
00:04:35,120 –> 00:04:37,520
بعدی این همان چیزی است که ما برمیگردانیم، اما
126
00:04:37,520 –> 00:04:39,919
چگونه میتوانیم این کار را انجام دهیم اگر بدانیم
127
00:04:39,919 –> 00:04:41,919
عمق دو تابع کجاست زیرا ما این کار را به
128
00:04:41,919 –> 00:04:44,880
صورت بازگشتی انجام دادیم. فقط از
129
00:04:44,880 –> 00:04:47,199
تابع بعدی که t را داریم برگردیم o
130
00:04:47,199 –> 00:04:50,080
به ریشه بازگردید که اشکالی ندارد زیرا
131
00:04:50,080 –> 00:04:52,240
فرض کنید ما فقط تصمیم داریم اینها را در
132
00:04:52,240 –> 00:04:54,560
نوعی لیست یا نوعی ساختار داده آرایه ای
133
00:04:54,560 –> 00:04:57,440
که کار می کند ثبت کنیم، اما در
134
00:04:57,440 –> 00:04:59,440
آن مرحله شما به نوعی کار اضافی
135
00:04:59,440 –> 00:05:02,400
انجام می دهید در حالی که این احتمالا امکان پذیر است.
136
00:05:02,400 –> 00:05:04,800
آنچه ما متوجه شده ایم این است که ما قبلاً
137
00:05:04,800 –> 00:05:07,120
اینها را در حافظه داریم زیرا این کار را
138
00:05:07,120 –> 00:05:08,639
با بازگشت انجام می دهیم و سپس فقط
139
00:05:08,639 –> 00:05:10,880
آن را به یک لیست اضافه می کنیم، شاید
140
00:05:10,880 –> 00:05:12,960
بتوانیم به هر حال از بازگشت بگذریم و در
141
00:05:12,960 –> 00:05:15,759
ابتدا این مقادیر را به یک لیست اضافه کنیم.
142
00:05:15,759 –> 00:05:17,680
حتی اگر این کار را به صورت بازگشتی انجام
143
00:05:17,680 –> 00:05:19,840
دهیم، اجازه دهید آن را به صورت تکراری انجام دهیم و فقط شروع کنیم به
144
00:05:19,840 –> 00:05:23,199
اضافه کردن مقادیر به یک لیست یا بهتر است بگوییم یک
145
00:05:23,199 –> 00:05:26,800
پشته که برای df های تکراری استفاده می شود، بنابراین
146
00:05:26,800 –> 00:05:30,479
این پیچیدگی کلی حافظه uh
147
00:05:30,479 –> 00:05:33,520
از big o از h را برآورده می کند، زیرا هر
148
00:05:33,520 –> 00:05:35,680
پیمایش به ترتیب یک
149
00:05:35,680 –> 00:05:38,000
بازگشتی یا تکراری
150
00:05:38,000 –> 00:05:40,400
حافظه h بزرگی خواهد داشت، اما نکته اینجاست که
151
00:05:40,400 –> 00:05:44,160
ما تک تک مقادیر را
152
00:05:44,160 –> 00:05:46,720
به پشته اضافه نمیکنیم، بلکه فقط به ارتفاع اضافه میکنیم
153
00:05:46,720 –> 00:05:48,080
و اتفاقاً اگر
154
00:05:48,080 –> 00:05:50,560
با تکراری آشنا نیستید. dfs من در واقع
155
00:05:50,560 –> 00:05:52,240
دی چند روز پیش ویدیویی روی آن گذاشتم، بنابراین
156
00:05:52,240 –> 00:05:53,520
توصیه میکنم اگر
157
00:05:53,520 –> 00:05:55,919
زیاد با آن آشنا نیستید آن را بررسی کنید، اما
158
00:05:55,919 –> 00:05:57,280
اساساً اینطوری کار میکند، ما
159
00:05:57,280 –> 00:05:59,440
این دو مقدار را به
160
00:05:59,440 –> 00:06:01,280
پشته خود اضافه میکنیم.
161
00:06:01,280 –> 00:06:03,759
مقادیر زیادی تا آنجا که می توانیم، بنابراین فرض کنید پشته ما
162
00:06:03,759 –> 00:06:05,759
چیزی شبیه به این است و سپس اگر
163
00:06:05,759 –> 00:06:07,919
تابع بعدی را فراخوانی کنیم، فقط
164
00:06:07,919 –> 00:06:09,440
پیش می رویم و مقدار را پاپ می کنیم و سپس آن
165
00:06:09,440 –> 00:06:11,440
سه را برمی گردانیم، اما
166
00:06:11,440 –> 00:06:14,000
بعد از اینکه آن سه مقدار را باز کنیم چه اتفاقی می افتد
167
00:06:14,000 –> 00:06:15,680
اگر کاری انجام دهیم. در آن صورت متفاوت است
168
00:06:15,680 –> 00:06:18,639
زیرا اگر واقعاً یک
169
00:06:18,639 –> 00:06:21,120
فرزند راست از این سه نفر داشتیم، مطمئناً میدانیم
170
00:06:21,120 –> 00:06:23,120
که هیچ فرزند چپی ندارد
171
00:06:23,120 –> 00:06:25,440
زیرا اگر ما این کار را میکردیم یا قبلاً آنها را بیرون میدادیم یا
172
00:06:25,440 –> 00:06:27,520
در
173
00:06:27,520 –> 00:06:29,759
حال حاضر در پشته