utkarsh2299 commited on
Commit
45a279f
·
verified ·
1 Parent(s): 3c60689

Upload 13 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ OrigVideo/Week3_Lecture4.mp4 filter=lfs diff=lfs merge=lfs -text
OrigVideo/Week3_Lecture4.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c459397e7d3d1d58b69d7649b7254e73ecc9d4ff0f967e3eeaff5a458732568a
3
+ size 34824798
README.md CHANGED
@@ -1,3 +1,101 @@
1
- ---
2
- license: cc-by-4.0
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Lip-Sync Video Generation
2
+
3
+ This project generates a lip-synced video based on an original video and translated subtitles.
4
+
5
+ In general, after translating English text to Indian languages, the audio duration in Indian languages tends to be longer than that of the English version. This discrepancy creates a lag between the video and audio during synthesis. To address this issue and ensure synchronization, we initiated two projects:
6
+
7
+ Project 1: generate_Lipsync_videos - In this project, we maintained the constant speed of the audio and slowed down the video by interpolating the video frames. This approach ensured proper synchronization between the audio and video, resulting in a video duration longer than the original.
8
+
9
+ Project 2: [generate_lipsync_videos_with_length_match](https://github.com/smtiitm/generate_lipsync_videos_with_length_match/tree/main) - This method aimed to maintain synchronization without altering the original video's duration by matching the utterance durations of the English version to the Indian language audio. However, this resulted in inconsistencies in audio speed, with some portions of the synthesized video playing very fast or slow, leading to poor output quality. To maintain audio quality and proper synchronization, we uniformly increased the audio speed based on the video duration requirement and placed it appropriately throughout the video.
10
+
11
+ ## Prerequisites
12
+
13
+ - Conda
14
+ - Python 3.8
15
+
16
+ ## Setup
17
+
18
+ 1. Clone the repository:
19
+
20
+ ```bash
21
+ git clone <repository-url> #https://github.com/smtiitm/generate_Lipsync_videos.git
22
+ cd <repository-directory> #generate_Lipsync_videos
23
+ ```
24
+
25
+ 2. Create and activate the conda environment:
26
+
27
+ ```bash
28
+ conda create -n lipsync_env python=3.8
29
+ conda activate lipsync_env
30
+ ```
31
+
32
+ 3. Install the required packages:
33
+
34
+ ```bash
35
+ pip install -r requirements.txt
36
+ ```
37
+ 4. Currently the code uses our APIs for text-to-speech generation. You can use your own TTS API (make sure to use the correct payload given in `vtt_to_speech.py` file) URL in `srt_to_audio_original` file. The current APIs are local to the lab and can be requested via mail.
38
+
39
+ ## Usage
40
+
41
+ 1. Edit the `run_script.sh` file to assign the paths to your original video and translated subtitles:
42
+
43
+ ```bash
44
+ original_video_path="path/to/original_video.mp4"
45
+ translated_srt_path="path/to/translated_subtitles.srt"
46
+ ```
47
+
48
+ 2. Assign the target language code in `run_script.sh`:
49
+
50
+ ```bash
51
+ target_language_code="hin" # Example: 'hin' for Hindi
52
+ ```
53
+
54
+ 3. Run the script:
55
+
56
+ ```bash
57
+ ./run_script.sh
58
+ ```
59
+ 4. Current supported sampling rate is 22.5KHz and .wav format is preferred.
60
+
61
+ ## Supported Languages
62
+
63
+ - Hindi (hin)
64
+ - Malayalam (mal)
65
+ - Kannada (kan)
66
+ - Bengali (bn)
67
+ - Urdu (ur)
68
+ - Telugu (tel)
69
+ - Punjabi (pun)
70
+ - Marathi (mar)
71
+ - Gujarati (guj)
72
+ - Tamil (tam)
73
+ - English (en)
74
+
75
+ ### Citation
76
+ If you use this repo in your research or work, please consider citing:
77
+
78
+
79
+ COPYRIGHT
80
+ 2024, Speech Technology Consortium,
81
+
82
+ Bhashini, MeiTY and by Hema A Murthy & S Umesh,
83
+
84
+
85
+ DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING
86
+ and
87
+ ELECTRICAL ENGINEERING,
88
+ IIT MADRAS. ALL RIGHTS RESERVED "
89
+
90
+
91
+
92
+ Shield: [![CC BY 4.0][cc-by-shield]][cc-by]
93
+
94
+ This work is licensed under a
95
+ [Creative Commons Attribution 4.0 International License][cc-by].
96
+
97
+ [![CC BY 4.0][cc-by-image]][cc-by]
98
+
99
+ [cc-by]: http://creativecommons.org/licenses/by/4.0/
100
+ [cc-by-image]: https://i.creativecommons.org/l/by/4.0/88x31.png
101
+ [cc-by-shield]: https://img.shields.io/badge/License-CC%20BY%204.0-lightgrey.svg
TTS_AUDIO/VTT/Week4_Lecture3_Cleaned_Tagged.ta.vtt ADDED
@@ -0,0 +1,496 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ WEBVTT
2
+
3
+ 00:00:02.246 --> 00:00:06.190
4
+ <DT>merge sort </DT> என்பது <DT>order</DT> <DNT>n log n</DNT> <DT>sorting algorithm</DT> என்று பார்த்தோம்.
5
+
6
+ 00:00:06.190 --> 00:00:10.509
7
+ ஆனால் இது சில குறைபாடுகளைக் கொண்டுள்ளது. இது சில நேரங்களில் <DT>impractical</DT> ஆகிறது.
8
+
9
+ 00:00:10.849 --> 00:00:14.740
10
+ முக்கிய பிரச்சனை என்னவென்றால், <DT>merging</DT> க்கு <DT>extra space</DT> தேவைப்படுகிறது.
11
+
12
+ 00:00:14.869 --> 00:00:19.076
13
+ <DT>recursion</DT> ஐ பயன்படுத்தாமல் <DT>implement merge sort </DT> செய்வது கடினம் என்பதையும் நாம் பார்த்தோம்.
14
+
15
+ 00:00:19.101 --> 00:00:22.108
16
+ மற்றும் <DT>recursion</DT> <DT>programming language</DT> ல் அதன் சொந்த செலவைக் கொண்டுள்ளது.
17
+
18
+ 00:00:24.841 --> 00:00:26.952
19
+ எனவே, <DT>space problem</DT> ஐ தீர்க்கலாம்.
20
+
21
+ 00:00:27.736 --> 00:00:33.310
22
+ <DT>merge function</DT> ஐ <DT>implement</DT> செய்யும் <DT>பொருட்டு</DT>, <DT>merge sort </DT> க்கு <DT>extra space</DT> தேவைப்படுகிறது.
23
+
24
+ 00:00:33.590 --> 00:00:38.500
25
+ நாம் ஏன் <DT>merge</DT> செய்ய வேண்டும்? நாம் <DT>merge</DT> செய்ய வேண்டியதன் காரணம், நாம் <DT>merge sort </DT> ஐ செய்யும்போது,
26
+
27
+ 00:00:38.500 --> 00:00:45.759
28
+ நம்மிடம் <DT>initial list</DT> உள்ளது. பின்னர் அதை இரண்டு பகுதிகளாக split செய்கிறோம். ஆனால், பொதுவாக <DT>left</DT> இலிருந்து <DT>items</DT> கள் இருக்கலாம்.
29
+
30
+ 00:00:45.759 --> 00:00:50.409
31
+ <DNT>right</DNT> இலிருந்து <DT>bigger than items</DT>. எனவே, <DT>instance</DT> ஆக நாம் சொன்னால்,
32
+
33
+ 00:00:50.450 --> 00:00:54.250
34
+ <DT>left</DT> ல் <DT>even numbers</DT> மற்றும் <DNT>right</DNT> ல் <DT>odd numbers</DT>.
35
+
36
+ 00:00:54.550 --> 00:00:58.900
37
+ இரண்டு பக்கங்களிலிருந்தும் <DT>numbers alternately</DT> எடுத்துக்கொண்டு <DT>merge</DT> செய்ய வேண்டும்.
38
+
39
+ 00:00:59.630 --> 00:01:09.646
40
+ <DT>divided problem</DT> ன் <DT>left</DT> பக்கத்தில் உள்ள அனைத்தும் <DT>divided problem</DT> ன் <DNT>வலது</DNT> பக்கத்தில் உள்ள அனைத்தையும் விட சிறியதாக இருக்கும்படி <DT>arrange</DT> செய்தால்,
41
+
42
+ 00:01:10.593 --> 00:01:12.146
43
+ பின்னர், நாம் அனைத்தையும் <DT>merge</DT> செய்ய தேவையில்லை.
44
+
45
+ 00:01:12.699 --> 00:01:18.130
46
+ மேலும் இது <DT>merge</DT> செய்வதற்கு, கூடுதல் space தேவைப்படும் <DT>problem</DT> ஐ தவிர்க்கலாம்.
47
+
48
+ 00:01:20.689 --> 00:01:23.702
49
+ <DT>merge</DT> இல்லாமல் எப்படி <DT>divide</DT> மற்றும் <DT>conquer</DT> செய்வது.
50
+
51
+ 00:01:25.243 --> 00:01:27.659
52
+ <DT>median value</DT> நமக்குத் தெரியும் என்று வைத்துக்கொள்வோம்.
53
+
54
+ 00:01:27.659 --> 00:01:33.716
55
+ ஒரு <DT>set</DT> ல் உள்ள <DT>median value</DT> என்பது <DT>half</DT> the <DT>elements</DT> are <DT>smaller than half</DT> are <DT>bigger</DT> ஆக இருக்கும் <DT>value</DT> என்பதை நினைவில் கொள்ளுங்கள்.
56
+
57
+ 00:01:35.649 --> 00:01:42.124
58
+ <DT>median</DT> விட <DT>smaller than</DT> <DT>values</DT> அனைத்தையும் <DT>left half</DT> க்கும், <DT>median</DT> விட <DT>bigger than</DT> அனைத்தையும் <DNT>right half</DNT> க்கும் நகர்த்தலாம்.
59
+
60
+ 00:01:43.883 --> 00:01:52.180
61
+ நாம் பார்ப்பது போல, <DT>list</DT> ன் <DT>length</DT> க்கு <DT>time proportional</DT> ஆக புதிய <DT>array</DT> வை உருவாக்காமல் இதைச் செய்யலாம்.
62
+
63
+ 00:01:53.816 --> 00:02:00.989
64
+ இந்த <DT>rearrangement</DT> ஐ செய்த பிறகு, அனைத்து <DT>smaller values</DT> களையும் <DT>left half</DT> க்கும் <DT>bigger values</DT> களை <DNT>right half</DNT> க்கும் நகர்த்தவும்.
65
+
66
+ 00:02:00.989 --> 00:02:06.443
67
+ இந்த <DT>divide</DT> மற்றும் <DT>conquer strategy</DT> ஐ நாம் <DT>recursively</DT> பயன்படுத்தலாம். மேலும் <DNT>right</DNT> மற்றும் <DT>left half</DT> ஐ தனித்தனியாக <DT>sort</DT> செய்யலாம்.
68
+
69
+ 00:02:07.519 --> 00:02:12.520
70
+ மேலும் <DT>left half</DT> ல் உள்ள அனைத்தும், <DNT>right half</DNT> ல் உள்ள அனைத்தையும் விட <DT>சிறியது</DT> என்று நாம் உத்தரவாதம் அளித்துள்ளோம்.
71
+
72
+ 00:02:13.019 --> 00:02:17.050
73
+ இது தானாகவே இதற்கு அர்த்தம் <DT>divide</DT> மற்றும் <DT>conquer</DT> step க்கு பிறகு,
74
+
75
+ 00:02:17.050 --> 00:02:24.442
76
+ <DT>left half</DT> ஏற்கனவே <DNT>right half</DNT> க்கு கீழே இருப்பதால், non-trivial முறையில் answers களை combine செய்ய வேண்டிய அவசியமில்லை. நாம் <DT>merge</DT> செய்ய தேவையில்லை.
77
+
78
+ 00:02:28.309 --> 00:02:34.210
79
+ இந்த <DT>strategy</DT> ஐ பயன்படுத்தினால், <DT>merge sort </DT> போன்ற ஒரு <DT>recursive equation</DT> ஐ பெறுவோம்.
80
+
81
+ 00:02:34.210 --> 00:02:42.370
82
+ <DNT>length n</DNT> இன் <DT>list</DT> ஐ <DT>sort</DT> செய்வதற்கு <DT>time</DT> தேவைப்படும். முதலில் <DNT>size n</DNT> இன் இரண்டு <DT>lists</DT> களை 2 ஆல் <DT>sort</DT> செய்ய வேண்டும்.
83
+
84
+ 00:02:42.370 --> 00:02:50.039
85
+ நாம் <DNT>order n </DNT> ஐ செய்வோம் <DT>merging</DT> ஆக அல்ல. <DT>list</DT> ஐ <DT>decompose</DT> செய்வதற்காக. அதனால் அனைத்து <DT>smaller values</DT> களும் <DT>left</DT> மற்றும் <DNT>right</DNT> இல் இருக்கும்.
86
+
87
+ 00:02:50.064 --> 00:02:54.483
88
+ நாம் <DT>recursive step</DT> செய்வதற்கு முன் rearranging <DT>step</DT> <DNT>order n</DNT> ஆகும்.
89
+
90
+ 00:02:54.508 --> 00:02:57.879
91
+ அதேசமயம் <DT>merge</DT> என்பது <DT>recursive step</DT> க்கு பின் வரும் <DT>step</DT> ஆகும்.
92
+
93
+ 00:02:57.879 --> 00:03:03.879
94
+ இது முந்தைய <DT>case</DT> ல் <DNT>order n</DNT> ஆக இருந்தது. ஆனால் நாம் <DT>recurrence</DT> ஐ <DT>solve</DT>செய்தால் அதே ஒன்றுதான். நமக்கு மற்றொரு <DNT>order n log n algorithm</DNT> கிடைக்கும்.
95
+
96
+ 00:03:08.730 --> 00:03:12.340
97
+ இந்த <DT>approach</DT> இல் பெரிய <DT>bottleneck</DT> என்னவென்றால் <DT>median</DT> ஐ கண்டறிவதாகும்.
98
+
99
+ 00:03:13.190 --> 00:03:20.663
100
+ ஒரு <DT>list</DT> ஐ <DT>sorting</DT> செய்வதன் நன்மைகளில் ஒன்று, <DT>sorting</DT> க்கு பின் <DT>median</DT> ஐ middle <DT>element</DT> ஆக நாம் அடையாளம் காணலாம் என்பதை நினைவில் கொள்ளுங்கள்.
101
+
102
+ 00:03:21.890 --> 00:03:24.336
103
+ இப்போது, இங்கே நாம் <DT>sorting</DT> செய்வதற்கு முன் <DT>median</DT> ஐ கேட்கிறோம்.
104
+
105
+ 00:03:24.996 --> 00:03:28.539
106
+ ஆனால், நமது நோக்கம் <DT>sort</DT> செய்வது. அது <DT>paradoxical</DT> ஆகும்.
107
+
108
+ 00:03:28.539 --> 00:03:33.219
109
+ <DT>sorting</DT>ன் <DT>output</DT> <DT>sorting</DT> ஆன <DT>input</DT> ஆக இருக்க வேண்டும் என நாம் விரும்பினால்.
110
+
111
+ 00:03:34.892 --> 00:03:42.580
112
+ எனவே, <DT>list</DT> ஐ <DNT>split</DNT> செய்து <DT>element</DT> ன் மிகவும் எளிமையான தேர்வு மூலம் <DT>strategy</DT> யை முயற்சிக்க வேண்டும் என்பதே இதன் பொருள்.
113
+
114
+ 00:03:42.825 --> 00:03:46.780
115
+ <DT>median</DT> ஐ தேடுவதற்குப் பதிலாக, <DNT>list A</DNT> இல் சில <DT>value</DT> ஐ பெறுவோம்.
116
+
117
+ 00:03:46.780 --> 00:03:49.689
118
+ மற்றும் <DT>pivot element</DT> என அழைக்கப்படுவதைப் பயன்படுத்தவும்.
119
+
120
+ 00:03:49.689 --> 00:03:56.769
121
+ இந்த <DT>pivot</DT> ஐ பொறுத்து <DNT>A</DNT> என்று பிரிக்கிறோம். இதனால் அனைத்து <DT>smaller elements</DT> களும் <DT>left</DT> ஆகவும், <DT>bigger elements</DT> கள் ��னைத்தும் <DNT>right</DNT> ஆகவும் இருக்கும்.
122
+
123
+ 00:04:00.223 --> 00:04:11.636
124
+ இந்த <DT>algorithm</DT> <DT>quick sort</DT> என்று அழைக்கப்படுகிறது. இது 1960 களில் <DT>Tony Four</DT> என்ற நபரால் கண்டுபிடிக்கப்பட்டது மற்றும் இது மிகவும் பிரபலமான <DT>sorting algorithms</DT> களில் ஒன்றாகும்.
125
+
126
+ 00:04:12.103 --> 00:04:16.082
127
+ பொதுவாக <DT>array</DT> இன் <DT>list</DT> ல் முதல் <DT>element</DT> ஆக இருக்கும் <DT>pivot element</DT> ஐ தேர்வு செய்கிறோம்.
128
+
129
+ 00:04:16.759 --> 00:04:22.500
130
+ இந்த <DT>pivot</DT> இன் முடிவைப் பொறுத்து <DT>lower part</DT> லும் <DT>upper part</DT> லும் <DNT>partition A</DNT> செய்கிறோம்.
131
+
132
+ 00:04:22.500 --> 00:04:24.943
133
+ எனவே, அனைத்து <DT>smaller elements</DT> களையும் <DT>left</DT> க்கு நகர்த்துகிறோம்.
134
+
135
+ 00:04:25.056 --> 00:04:28.149
136
+ மற்றும் அனைத்து <DT> bigger elements</DT> முதல் <DNT>right</DNT> வரை <DT>pivotal</DT> தேர்வைப் பொறுத்து.
137
+
138
+ 00:04:29.523 --> 00:04:34.163
139
+ இரண்டிற்கும் இடையே <DT>pivot</DT> வருவதை உறுதிசெய்கிறோம். ஏனெனில் <DT>array</DT> ல் முதல் <DT>element</DT> <DT>pivot</DT> ஆக எடுத்துள்ளோம்.
140
+
141
+ 00:04:34.190 --> 00:04:41.036
142
+ இதற்குப் பிறகு நாம் அதை <DT>lower</DT> மற்றும் <DT>upper bound</DT> க்கு இடையில் உள்ள <DT>center</DT> க்கு நகர்த்த விரும்புகிறோம். பின்னர், இரண்டு <DT>partitions</DT> களை <DT>recursively sort</DT> செய்கிறோம்.
143
+
144
+ 00:04:44.456 --> 00:04:48.910
145
+ ஒரு பொதுவான <DT>list</DT> ல் <DT>quick sort</DT> எவ்வாறு வேலை செய்யும் என்பது பற்றிய <DT>high level view</DT> இங்கே உள்ளது.
146
+
147
+ 00:04:48.910 --> 00:04:56.143
148
+ இது தான் நமது <DT>list</DT> என்று வைத்துக்கொள்வோம். <DT>list</DT> ன் தொடக்கத்தை <DT>pivot element</DT> ஆக முதல் <DT>element</DT> ஐ அடையாளம் காண்போம்.
149
+
150
+ 00:04:56.950 --> 00:05:01.569
151
+ இப்போது, மீதமுள்ள <DT>elements</DT> களில், எந்த <DNT>ones</DNT> <DT>smaller</DT> மற்றும் எந்த <DNT>ones</DNT> <DT>bigger</DT> என்பதைக் கண்டுபிடிக்க வேண்டும்.
152
+
153
+ 00:05:02.410 --> 00:05:11.510
154
+ இதை எப்படிச் செய்வோம் என்று சொல்லாமல், 32, 22 மற்றும் 13 ஆகிய மூன்று <DT>elements</DT> களை <DT>smaller</DT> ஆகவும் <DNT>yellow</DNT> ல் <DT>marked </DT> செய்யபட்டதாகவும் அடையாளப்படுத்துகிறோம்.
155
+
156
+ 00:05:11.810 --> 00:05:15.069
157
+ மற்றும் <DNT>green</DNT> இல் <DT>marked </DT> செய்யப்பட்ட மற்ற 4 <DT>elements</DT> கள் பெரியவை.
158
+
159
+ 00:05:16.160 --> 00:05:20.040
160
+ முதல் <DT>step</DT> உண்மையில் இந்த <DT>criterion</DT> ஐ பொறுத்து <DT>partition</DT> செய்ய வேண்டும்.
161
+
162
+ 00:05:20.040 --> 00:05:24.810
163
+ நாம் இந்த <DT>elements</DT> களை நகர்த்த வேண்டும். அதனால் அவை இரண்டு <DT>blocks</DT> ஆக வரும்.
164
+
165
+ 00:05:24.810 --> 00:05:27.550
166
+ அந்த 13, 32 மற்றும் 22 <DT>left</DT> பக்கம் வரும்.
167
+
168
+ 00:05:27.550 --> 00:05:33.430
169
+ 63 57, 91 மற்றும் 78, <DNT>right</DNT> மற்றும் <DT>pivot element</DT> 43 <DT>middle</DT> ல் வருகிறது.
170
+
171
+ 00:05:33.947 --> 00:05:36.781
172
+ இது <DT>rearranging step</DT> மற்றும் இப்போது
173
+
174
+ 00:05:37.060 --> 00:05:41.529
175
+ நாம் <DNT>yellow bits</DNT> மற்றும் <DNT>green bits</DNT> ஆகியவற்றை <DT>recursively sort</DT> செய்வோம். பிறகு அதைச் செய்யலாம் என்று கருதினால்,
176
+
177
+ 00:05:41.529 --> 00:05:45.480
178
+ நம்மிடம் ஒரு <DT>sorted array</DT> உள்ளது மற்றும் அனைத்து <DNT>yellow</DNT> பொருட்களும் <DT>smaller than </DT>43 ஆக இருப்ப��ை கவனிக்கவும்.
179
+
180
+ 00:05:45.480 --> 00:05:49.509
181
+ மேலும் அனைத்து <DNT>green</DNT> விஷயங்களும் <DT>bigger than</DT> 43. மேலும் <DT>merging</DT> செய்ய தேவையில்லை.
182
+
183
+ 00:05:52.243 --> 00:05:54.899
184
+ எனவே, <DT>partitioning</DT> எவ்வாறு செயல்படுகிறது என்பதைப் பார்ப்போம்.
185
+
186
+ 00:05:54.899 --> 00:05:59.350
187
+ இங்கே நம்மிடம் முந்தைய <DT>list</DT> ல் உள்ளது. மேலும் 43 ஐ நமது <DT>pivot element</DT> ஆக <DT>marked </DT> செய்துள்ளோம்.
188
+
189
+ 00:05:59.350 --> 00:06:03.112
190
+ மீதமுள்ள <DT>elements</DT> களை <DT>scan</DT> செய்து அவற்றை <DT>divide</DT> செய்ய விரும்புகிறோம்.
191
+
192
+ 00:06:03.137 --> 00:06:08.742
193
+ இரண்டு குழுக்கள், <DT>smaller than</DT> 43, <DNT>yellow ones</DNT>, <DT>bigger than</DT> 43, <DNT>green ones</DNT> மற்றும் அவற்றை <DT>rearrange</DT> செய்யவும்.
194
+
195
+ 00:06:09.962 --> 00:06:13.839
196
+ நாம் என்ன செய்வோம் இரண்டு <DT>pointers</DT> கள் <DNT>yellow pointer</DNT> மற்றும் <DNT>green pointer</DNT> ஐ வைத்திருப்போம்.
197
+
198
+ 00:06:14.155 --> 00:06:19.081
199
+ மேலும் பொதுவான விதி என்னவென்றால், எந்த ஒரு <DT>point</DT>லும் நாம் சிறிது <DT>distance</DT> ல் இருப்போம்.
200
+
201
+ 00:06:19.355 --> 00:06:24.129
202
+ நான் <DNT>orange</DNT> நிறத்தில் வரையப் போகும் <DT>visible</DT> <DNT>yellow pointer</DNT> மற்றும் <DNT>green pointer</DNT>.
203
+
204
+ 00:06:24.129 --> 00:06:29.165
205
+ இவை இந்த <DT>order</DT> ல் நகரும் <DNT>orange pointer</DNT> அல்லது <DNT>yellow pointer</DNT> எப்போதும் <DNT>green pointer</DNT> பின்னால் இருக்கும்.
206
+
207
+ 00:06:29.565 --> 00:06:35.397
208
+ நீங்கள் பராமரிக்கும் <DT>inductive property</DT> என்னவென்றால், இந்த <DT>elements</DT> கள் 43 ஐ விட <DT>smaller than</DT> அல்லது சமமாகவோ இருக்கும்.
209
+
210
+ 00:06:35.910 --> 00:06:40.643
211
+ இந்த <DT>elements</DT> கள் <DT>bigger than</DT> 43 மற்றும் இந்த <DT>elements</DT> கள் <DT>தெரியவில்லை</DT>.
212
+
213
+ 00:06:42.577 --> 00:06:46.139
214
+ நாம் செய்ய முயற்சிப்பது என்னவென்றால், <DT>left</DT> ல் இருந்து <DNT>right</DNT> க்கு நகர்த்த முயற்சிக்கிறோம்.
215
+
216
+ 00:06:46.139 --> 00:06:49.589
217
+ ஒவ்வொரு முறையும் <DT>unknown elements</DT> ஐ காணும் அனைத்து <DT>unknown elements</DT> களையும் <DT>classify</DT> செய்யவும்.
218
+
219
+ 00:06:49.552 --> 00:06:52.660
220
+ இந்த property ஐ நாம் maintain பண்ண இரண்டு <DT>pointers</DT> களை மாற்றுவோம்.
221
+
222
+ 00:06:52.700 --> 00:06:57.699
223
+ 43 க்கும் முதல் <DT>pointer</DT> க்கும் இடையில் <DT>elements smaller than</DT> 43 அல்லது அதற்கு சமமாக உள்ளன.
224
+
225
+ 00:06:57.699 --> 00:07:01.494
226
+ முதல் <DT>pointer</DT> க்கும் இரண்டாவது <DT>pointer</DT> க்கும் இடையில் நம் <DT>elements</DT> கள் கண்டிப்பாக 43 க்கு <DT>greater</DT> ஆக உள்ளது.
227
+
228
+ 00:07:01.752 --> 00:07:05.230
229
+ மற்றும் <DNT>green pointer</DNT> இன் <DNT>right</DNT> பக்கம் இன்னும் <DT>scanned</DT> செய்யப்படாதவை உள்ளன.
230
+
231
+ 00:07:07.023 --> 00:07:10.000
232
+ எனவே, ஆரம்பத்தில் எதுவும் தெரியவில்லை. பின்னர் நாம் 32 ஐ பார்க்கிறோம்.
233
+
234
+ 00:07:10.000 --> 00:07:14.618
235
+ 32 43 ஐ விட <DT>smaller than</DT> ஆக இருப்பதால், <DNT>yellow pointer</DNT> ஐ நகர்த்துகிறோம். மேலும் <DNT>green pointer</DNT> ஐ உடன் தள்ளுகிறோம்.
236
+
237
+ 00:07:14.643 --> 00:07:16.949
238
+ தெரியாத விஷயம் 22 இல் தொடங்குகிறது.
239
+
240
+ 00:07:16.949 --> 00:07:22.060
241
+ <DNT>yellow</DNT> மற்றும் <DNT>green pointer</DNT> ஆகியவற்றுக்கு இடையே எதுவும் இல்லை. <DT>value bigger than</DT> 43 ஐ நாம் இன்னும் கண்டுபிடி��்கவில்லை.
242
+
243
+ 00:07:22.949 --> 00:07:24.910
244
+ எனவே, 22 க்கும் அதே நடக்கும்.
245
+
246
+ 00:07:24.910 --> 00:07:28.629
247
+ இப்போது, 78ஐ பார்க்கும்போது, 78 <DT>bigger than</DT> 43 என்பதைக் கவனிக்கிறோம்.
248
+
249
+ 00:07:29.008 --> 00:07:33.635
250
+ இப்போது, நாம் <DNT>green pointer</DNT> ஐ மட்டுமே நகர்த்துகிறோம். மேலும் <DNT>yellow pointer</DNT> ஐ அல்ல. இப்போது, இந்த 3 இடைவெளிகளை முன்பு போலவே வைத்திருக்கிறோம்.
251
+
252
+ 00:07:33.935 --> 00:07:36.819
253
+ இது 43 க்கு குறைவான <DT>equal</DT> ஆன பகுதி என்பதை நினைவில் கொள்ளுங்கள்.
254
+
255
+ 00:07:36.819 --> 00:07:44.350
256
+ இது <DT>greater than</DT> 43 உள்ள பகுதி மற்றும் இந்த பகுதி unknown <DNT>right</DNT>, நாம் இந்த வழியில் தொடர்கிறோம்.
257
+
258
+ 00:07:44.350 --> 00:07:48.189
259
+ இப்போது நாம் 63 ஐ பார்க்கிறோம். மீண்டும் 63 <DNT>green zone</DNT> ஐ நீட்டிக்கிறது.
260
+
261
+ 00:07:48.189 --> 00:07:52.540
262
+ 57 ஒரு <DNT>green zone</DNT> ஐ நீட்டிக்கிறது 91 ஒரு <DNT>green zone</DNT> ஐ நீட்டிக்கிறது.
263
+
264
+ 00:07:52.540 --> 00:07:56.470
265
+ இப்போது, 13 ஐ கண்டுபிடிக்கும்போது நாம் ஏதாவது செய்ய வேண்டும்.
266
+
267
+ 00:07:56.470 --> 00:08:00.100
268
+ 13 என்பது இப்போது <DNT>yellow zone</DNT> ல் சேர்க்கப்பட வேண்டிய ஒரு <DT>element</DT>.
269
+
270
+ 00:08:00.205 --> 00:08:03.705
271
+ ஒரு <DT>strategy</DT> நிறைய மாற்றங்களைச் செய்ய வேண்டும்.
272
+
273
+ 00:08:03.730 --> 00:08:07.360
274
+ நாம் 13 ஐ 22 இருக்கும் இடத்திற்கு அல்லது 22 க்குப் பிறகு நகர்த்துகிறோம்.
275
+
276
+ 00:08:07.360 --> 00:08:10.180
277
+ மேலும் 78 இல் இருந்து எல்லாவற்றையும் <DNT>right</DNT> க்கு தள்ளுகிறோம்.
278
+
279
+ 00:08:10.250 --> 00:08:15.220
280
+ ஆனால் உண்மையில், ஒரு புத்திசாலித்தனமான <DT>strategy</DT> என்னவென்றால், 13 இங்கே செல்ல வேண்டும் என்று சொல்வது.
281
+
282
+ 00:08:17.605 --> 00:08:21.519
283
+ நாம் space ஐ உருவாக்க வேண்டும். ஆனால் <DT>space</DT> ஐ உருவாக்குவதற்கு பதிலாக.
284
+
285
+ 00:08:21.519 --> 00:08:30.399
286
+ எப்படியும் <DNT>green</DNT> விஷயங்களை நாம் <DT>sort</DT> செய்யபோகிறோம். அது ஒரு பொருட்டல்ல என்று சொல்லலாம். இரண்டையும் எந்த வழியில் <DT>sort</DT> செய்கிறோம் என்பது எப்படி முக்கியம். இந்த 78ஐ எடுத்து 13க்கு நகர்த்துவோம்.
287
+
288
+ 00:08:30.399 --> 00:08:33.009
289
+ எந்த மாற்றத்தையும் செய்வதற்கு பதிலாக.
290
+
291
+ 00:08:33.009 --> 00:08:36.370
292
+ <DNT>green</DNT> zone ல் முதல் <DT>element</DT> ஐ <DT>exchange</DT> செய்கிறோம்.
293
+
294
+ 00:08:36.370 --> 00:08:38.320
295
+ நாம் இதுவரை பார்க்கும் <DT>element</DT> உடன்.
296
+
297
+ 00:08:38.320 --> 00:08:41.980
298
+ அது தானாகவே <DNT>yellow zone</DNT> மற்றும் <DNT>green zone</DNT> இரண்டையும் சரியாக நீட்டிக்கும்.
299
+
300
+ 00:08:42.080 --> 00:08:49.299
301
+ நமது அடுத்த <DT>step</DT> 13 <DT>smaller than</DT> 43 என்பதை கண்டறிந்து, அதை 73 உடன் <DT>இடமாற்று</DT> செய்வது.
302
+
303
+ 00:08:49.399 --> 00:08:54.070
304
+ இப்போது, நம்மிடம் உள்ள <DT>pivot</DT> ன் <DNT>right</DNT> க்கு ஒரு <DT>intermediate stage</DT> ஐ அடைந்துள்ளோம்.
305
+
306
+ 00:08:54.070 --> 00:08:58.360
307
+ எல்லாவற்றையும் scanned செய்து, அவற்றை <DT>smaller</DT> ஆக வகைப்படுத்தியுள்ளோம்.
308
+
309
+ 00:08:58.360 --> 00:08:59.889
310
+ மற்றும் <DT>bigger</DT> ஐயும்.
311
+
312
+ 00:09:00.716 --> 00:09:04.216
313
+ இப்போது, <DNT>yellow</DNT> விஷயங்களை 43க்கு <DT>left</DT> பக்கம் <DT>push</DT> செய்ய வேண்டும்.
314
+
315
+ 00:09:05.036 --> 00:09:09.165
316
+ இப்போது, <DNT>yellow zone</DNT> ல் 13ஐ சேர்த்தபோது பார்த்த அதே <DT>problem</DT> மீண்டும் ஒருமுறை நமக்கு வந்துள்ளது.
317
+
318
+ 00:09:09.190 --> 00:09:13.210
319
+ நாம் 43 ஐ சரியான இடத்திற்கு நகர்த்தினால், இங்கே அனைத்தையும் <DNT>left</DNT> க்கு நகர்த்த வேண்டும்.
320
+
321
+ 00:09:13.404 --> 00:09:18.940
322
+ ஆனால், அதற்குப் பதிலாக இந்த 13ஐ <DNT>yellow zone</DNT> ல் கடைசி <DT>element</DT> ஆக எடுத்துக்கொள்ளலாம்.
323
+
324
+ 00:09:18.940 --> 00:09:22.149
325
+ மற்றும் அதை அங்கே <DT>replace</DT> செய்யவும். 32 மற்றும் 22 ஐ shift செய்ய வேண்டாம்.
326
+
327
+ 00:09:22.149 --> 00:09:26.759
328
+ இது <DT>order</DT> ஐ சீர்குலைக்கிறது. ஆனால் எப்படியும் இது <DT>unsorted</DT> செய்யாமல், <DT>unsorted</DT> ஆக உள்ளது.
329
+
330
+ 00:09:27.632 --> 00:09:29.889
331
+ நாம் இதை செய்கிறோம். இப்போது நம்மிடம் உள்ளது.
332
+
333
+ 00:09:30.001 --> 00:09:36.171
334
+ நாம் விரும்பியபடி <DT>array rearranged</DT> செய்யப்பட்டது. எனவே, <DT>left</DT> ல் உள்ள இவை அனைத்தும் <DT>smaller than</DT> <DT>pivot</DT>.
335
+
336
+ 00:09:37.244 --> 00:09:41.856
337
+ <DT>pivot</DT> நடுவில் உள்ளது. மற்றும் <DNT>right</DNT> ல் உள்ள அனைத்தும் <DT>bigger than</DT> <DT>pivot</DT>.
338
+
339
+ 00:09:46.550 --> 00:09:53.830
340
+ இங்கே <DT>python</DT> இன் ஒரு <DT>implementation</DT> உள்ளது. <DT>quick sort</DT> என்பது <DT>merge sort </DT> மற்றும் <DT>binary research</DT> போன்றவற்றைக் கொண்டிருக்கும் என்பதை நினைவில் கொள்ளவும்.
341
+
342
+ 00:09:53.830 --> 00:09:58.690
343
+ <DT>smaller</DT> மற்றும் <DT>smaller segments</DT> ல் அதை மீண்டும் மீண்டும் பயன்படுத்துகிறோம். பொதுவாக நாம் அதை <DT>pass</DT> செய்யவும்.
344
+
345
+ 00:09:58.690 --> 00:10:03.523
346
+ நாம் <DNT>call A</DNT> என்ற <DT>list</DT> க்கும், <DT>segment</DT> ன் <DT>end points</DT> ஆன <DNT>left</DNT> மற்றும் <DNT>right</DNT>.
347
+
348
+ 00:10:03.548 --> 00:10:07.238
349
+ நாம் ஒரு <DNT>slice l </DNT> முதல் <DNT>r minus 1</DNT> வரை செய்கிறோம்.
350
+
351
+ 00:10:08.244 --> 00:10:13.210
352
+ இந்த <DT>slice</DT> 1 அல்லது 0 <DT>length</DT> ஆக இருந்தால், நாம் எதுவும் செய்ய மாட்டோம்.
353
+
354
+ 00:10:14.223 --> 00:10:17.320
355
+ இல்லையெனில், நாம் முன்பு இருந்த இந்த <DT>partitioning strategy</DT> ஐ பின்பற்றுவோம்.
356
+
357
+ 00:10:17.708 --> 00:10:22.120
358
+ அதாவது <DNT>l</DNT> இலிருந்து <DNT>r minus 1</DNT> வரை <DT>sorting</DT> செய்கிறோம்.
359
+
360
+ 00:10:22.120 --> 00:10:24.220
361
+ எனவே, <DT>position l</DT>.
362
+
363
+ 00:10:24.379 --> 00:10:25.899
364
+ இது <DT>pivot</DT> ஆகும்.
365
+
366
+ 00:10:26.793 --> 00:10:29.671
367
+ <DNT>right</DNT> முதலில் இங்கே <DNT>yellow pointer</DNT> ஐ வைப்போம்.
368
+
369
+ 00:10:31.011 --> 00:10:33.635
370
+ <DNT>yellow zone</DNT> இன் முடிவு என்று கூறுகிறது.
371
+
372
+ 00:10:34.005 --> 00:10:38.500
373
+ உண்மையில் <DT>pivot</DT> உள்ளது அங்கு எதுவும் இல்லை. <DNT>yellow</DNT> என்பது <DNT>l plus 1</DNT> ஆகும்.
374
+
375
+ 00:10:38.500 --> 00:10:50.781
376
+ இப்போது <DNT>green</DNT>ஐ தொடர அனுமதிக்கிறோம். ஒவ்வொரு <DT>time</DT>ம் <DNT>green</DNT> இல் ஒரு <DT>element</DT> ஐ பார்க்கும்போது புதிய <DNT>green</DNT> ஒன்றைக் காட்டிலும் <DT>smaller than</DT> ஆக இருக்கும் <DT>pivot</DT> ஆகும். இது <DT>pivot</DT> என்பதை நினைவில் கொள்ளுங்கள்.
377
+
378
+ 00:10:51.965 --> 00:10:55.661
379
+ <DNT>right</DNT> நாம் எப்போதாவது ஒரு <DNT>green</DNT> ஐ பார்த்தால், அடுத்த <DT>value</DT> ஐ.
380
+
381
+ 00:10:55.686 --> 00:10:57.580
382
+ சரிபார்க்கப்பட வேண்டியதை விட <DT>smaller than</DT> அல்லது சமமானது.
383
+
384
+ 00:10:57.590 --> 00:11:01.714
385
+ நாம் <DT>exchange</DT> செய்கிறோம். இதனால் இந்த <DT>value</DT> ஐ <DNT>yellow zone</DNT> ன் முடிவுக்குக் கொண்டு வருகிறோம்.
386
+
387
+ 00:11:01.739 --> 00:11:03.220
388
+ இதைத்தான் 13ல் செய்தோம்.
389
+
390
+ 00:11:03.344 --> 00:11:07.590
391
+ பின்னர், <DNT>yellow pointer</DNT> ஐ நகர்த்துகிறோம். இல்லையெனில் கண்டிப்பாக <DT>bigger</DT> <DT>value</DT> ஐ கண்டால் நகர்த்துவோம்.
392
+
393
+ 00:11:07.590 --> 00:11:11.860
394
+ <DNT>green pointer</DNT> மட்டுமே <DT>for loop</DT> ஆல் மறைமுகமாக செய்யப்படுகிறது. மற்றொன்றை நகர்த்த மாட்டோம்.
395
+
396
+ 00:11:11.929 --> 00:11:14.883
397
+ இதன் முடிவில் நமக்கு <DT>pivot</DT> உள்ளது.
398
+
399
+ 00:11:15.894 --> 00:11:19.784
400
+ நாம் <DT>pivot</DT> க்கு சமமானதைக் காட்டிலும் குறைவானதைக் கொண்டுள்ளோம். பின்னர் <DT>greater than pivot</DT> ம் கொண்டுள்ளோம்.
401
+
402
+ 00:11:19.809 --> 00:11:27.914
403
+ இந்த விதியின் முடிவில் நாம் அடைந்த அந்த intermediate stage இதுதான். இப்போது, நாம் <DT>pivot</DT> ஐ கண்டுபிடித்து சரியான இடத்திற்கு நகர்த்த வேண்டும். எனவே, <DNT>yellow</DNT> என்பதை நினைவில் கொள்ளுங்கள்.
404
+
405
+ 00:11:29.241 --> 00:11:32.769
406
+ <DNT>yellow</DNT> <DNT>last</DNT> க்கு அப்பால் உள்ள <DT>position</DT> ஐ சுட்டிக்காட்டுகிறது.
407
+
408
+ 00:11:32.769 --> 00:11:37.440
409
+ <DT>element அதை விட சிறியது</DT>. <DNT>yellow</DNT> இதற்கு முன் எப்போதும் ஒரு <DT>value</DT> ஆகும்.
410
+
411
+ 00:11:37.440 --> 00:11:40.396
412
+ <DNT>yellow</DNT> minus 1 இன் <DT>value</DT> ஐ எடுத்து, <DT>left value</DT> உடன் <DT>exchange</DT> செய்வோம்.
413
+
414
+ 00:11:41.414 --> 00:11:48.765
415
+ இப்போது நாம் செய்ய வேண்டியது என்னவென்றால், நம்மிடம் இப்போது <DNT> p, p and greater than p</DNT> ஐ விட குறைவாக உள்ளது.
416
+
417
+ 00:11:49.627 --> 00:12:01.350
418
+ இங்குதான் <DNT>yellow</DNT> <DNT>சரியானது</DNT>. நாம் 0 இலிருந்து <DNT>yellow</DNT> minus 1 க்கு செல்ல வேண்டும். மீண்டும் <DNT>sort p </DNT> ஐ விரும்பவில்லை. ஏனெனில் <DNT>p</DNT> ஏற்கனவே சரியான இடத்தில் வைக்கப்பட்டுள்ளது.
419
+
420
+ 00:12:01.350 --> 00:12:06.391
421
+ <DNT>L</DNT> இலிருந்து <DNT>yellow</DNT> minus 1 ஆகவும், <DNT>yellow</DNT> இலிருந்து <DNT>right</DNT> முனையிலும் <DT>quick sort</DT> செய்வோம்.
422
+
423
+ 00:12:13.070 --> 00:12:17.070
424
+ <DT>slide</DT> ல் பார்த்த <DT>python code</DT> ஐ இங்கே ஒரு <DT>file</DT> ல் எழுதியுள்ளோம்.
425
+
426
+ 00:12:17.070 --> 00:12:20.320
427
+ slide ல் இருந்த அதே <DT>code</DT> இதுதானா என்பதை சரிபார்க்கலாம்.
428
+
429
+ 00:12:20.345 --> 00:12:28.786
430
+ நாம் அதை முயற்சி செய்து <DT>run</DT> செய்யலாம் மற்றும் அது செயல்படுகிறதா என்று சரிபார்க்கலாம். <DT>call python</DT>, இந்த <DT>function</DT> ஐ <DT>import</DT> செய்கிறோம்.
431
+
432
+ 00:12:32.849 --> 00:12:37.699
433
+ இது மீண்டும் ஒரு வகையான <DT>sorts</DT> <DT>function</DT> என்பதை நினைவில் கொள்ளுங்கள். எதையாவது <DT>sort</DT> செய்து அதன் விளைவைப் பார்க்க விரும்பினால்.
434
+
435
+ 00:12:37.753 --> 00:12:40.870
436
+ நாம் அதற்கு ஒரு <DT>name</DT> ஐ <DT>assign</DT> செய்ய வேண்டும். பின்னர் அந்த <DT>name</DT> ஐ <DT>sort</DT> செய்து, பிறகு <DT>name</DT> ஐ சரிபார்க்க வேண்டும்.
437
+
438
+ 00:12:40.909 --> 00:12:48.137
439
+ எடுத்துக்காட்டாக, 500 முதல் 0 வரைய���லான <DT>range</DT> of <DT>values</DT> ஐ எடுத்துக் கொள்வோம்.
440
+
441
+ 00:12:50.287 --> 00:12:58.090
442
+ இப்போது நாம் <DNT>quicksort l</DNT> என்று சொன்னால், அதற்கு <DNT>of course</DNT> முடிவைக் கொடுக்க வேண்டும்.
443
+
444
+ 00:13:01.020 --> 00:13:02.468
445
+ பிறகு <DNT>l</DNT> சரியாக <DT>sorted</DT> செய்யப்படும்.
446
+
447
+ 00:13:04.311 --> 00:13:09.523
448
+ நீங்கள் அனைத்தையும் பார்க்க முடியாது. ஆனால் 83 84 முதல் நூறு வரை மற்றும் இரண்டு 500 வரை பார்க்க முடியும்.
449
+
450
+ 00:13:10.995 --> 00:13:16.480
451
+ இப்போது, 1000 என்று சொன்னால், <DT>insertion sort</DT> ல் நமக்கு இருந்த அதே <DT>problem</DT> உள்ளது.
452
+
453
+ 00:13:17.897 --> 00:13:22.596
454
+ பின்னர் நாம் இதை <DT>quicksort</DT> செய்ய முயற்சிக்கிறோம். நீங்கள் இதை <DT>recursion depth</DT> ஆல் பெறுவீர்கள்.
455
+
456
+ 00:13:22.621 --> 00:13:29.644
457
+ <DT>worst case</DT> ல் நாம் பார்ப்பது போல, <DT>quick sort</DT> ஆனது <DT>insertion sort</DT> ஐ போலவே செயல்படுகிறது மற்றும் இது மோசமான case.
458
+
459
+ 00:13:29.669 --> 00:13:33.759
460
+ இதைப் போக்க, நாம் வழக்கமான காரியத்தைச் செய்ய வேண்டும். <DT>SYS module</DT> ஐ <DT>import</DT> செய்ய வேண்டும்.
461
+
462
+ 00:13:33.759 --> 00:13:35.409
463
+ <DT>recursion limit</DT> ஐ <DT>set</DT> செய்யவும்.
464
+
465
+ 00:13:36.658 --> 00:13:43.652
466
+ எனவே, பொருத்தமான பெரிய ஒன்று பத்தாயிரம் அல்லது நூறாயிரம் என்று சொல்லுங்கள். பின்னர் அதை <DT>quicksort</DT> செய்ய சொன்னால் எந்த problem உம் இல்லை.
467
+
468
+ 00:13:44.779 --> 00:13:49.299
469
+ <DT>python</DT> ல் இந்த <DT>recursion limit</DT> ஐ manually set செய்ய வேண்டிய மற்றொரு case இதுவாகும்.
470
+
471
+ 00:13:49.647 --> 00:13:56.929
472
+ உண்மையில் நாம் பார்க்கக்கூடிய ஒரு விஷயம் என்னவென்றால், <DT>quicksort</DT> என்பது நாம் நம்புவது போல் நல்லதல்ல, ஏனெனில்.
473
+
474
+ 00:13:57.008 --> 00:14:02.080
475
+ எடுத்துக்காட்டாக, 7500 என்று ஏதாவது <DT>size</DT> ஐ <DT>instance sort</DT> செய்யவும்.
476
+
477
+ 00:14:05.504 --> 00:14:09.554
478
+ பின்னர் அது ஒரு புலப்படும் நேரம் எடுக்கும். எனவே, <DNT>n log n</DNT> என்று <DT>merge sort </DT> ஐ பார்த்தோம்.
479
+
480
+ 00:14:09.790 --> 00:14:13.700
481
+ 5,000 மற்றும் 10000 மற்றும் 100,000 கூட <DT>instantaneously</DT> செய்யும்.
482
+
483
+ 00:14:13.832 --> 00:14:18.129
484
+ தெளிவாக <DT>quick sort</DT> மற்றும் <DT>merge sort </DT> செயல்படாது.
485
+
486
+ 00:14:18.165 --> 00:14:22.480
487
+ மற்றும் உண்மையில் <DT>quick sort</DT> க்கு <DT>order</DT> <DNT>n log n</DNT> <DT>merge sort </DT> இல்லை என்பதை நாம் பார்ப்போம்.
488
+
489
+ 00:14:22.511 --> 00:14:25.090
490
+ நாம் விரும்பியபடி நடத்தை.
491
+
492
+ 00:14:25.090 --> 00:14:28.539
493
+ அதற்குக் காரணம், நாம் <DT>median</DT> ஐ பயன்படுத்தாமல், split செய்வதற்கான முதல் <DT>value</DT> ஐ பயன்படுத்துகிறோம்.
494
+
495
+ 00:14:28.539 --> 00:14:33.909
496
+ அதை அடுத்த lecture ல் பார்ப்போம். ஏன் <DT>quick sort</DT> ல் உண்மையில் ஒரு worst case <DNT>order n log n algorithm</DNT> அல்ல.
Translated_SRT/Week3_Lecture4_Cleaned_Tagged.ta.srt ADDED
@@ -0,0 +1,659 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1
2
+ 00:00:02,246 --> 00:00:06,190
3
+ <DT>merge sort </DT> என்பது <DT>order</DT> <DNT>n log n</DNT> <DT>sorting algorithm</DT> என்று பார்த்தோம்.
4
+
5
+ 2
6
+ 00:00:06,190 --> 00:00:10,509
7
+ ஆனால் இது சில குறைபாடுகளைக் கொண்டுள்ளது. இது சில நேரங்களில் <DT>impractical</DT> ஆகிறது.
8
+
9
+ 3
10
+ 00:00:10,849 --> 00:00:14,740
11
+ முக்கிய பிரச்சனை என்னவென்றால், <DT>merging</DT> க்கு <DT>extra space</DT> தேவைப்படுகிறது.
12
+
13
+ 4
14
+ 00:00:14,869 --> 00:00:19,076
15
+ <DT>recursion</DT> ஐ பயன்படுத்தாமல் <DT>implement merge sort </DT> செய்வது கடினம் என்பதையும் நாம் பார்த்தோம்.
16
+
17
+ 5
18
+ 00:00:19,101 --> 00:00:22,108
19
+ மற்றும் <DT>recursion</DT> <DT>programming language</DT> ல் அதன் சொந்த செலவைக் கொண்டுள்ளது.
20
+
21
+ 6
22
+ 00:00:24,841 --> 00:00:26,952
23
+ எனவே, <DT>space problem</DT> ஐ தீர்க்கலாம்.
24
+
25
+ 7
26
+ 00:00:27,736 --> 00:00:33,310
27
+ <DT>merge function</DT> ஐ <DT>implement</DT> செய்யும் <DT>பொருட்டு</DT>, <DT>merge sort </DT> க்கு <DT>extra space</DT> தேவைப்படுகிறது.
28
+
29
+ 8
30
+ 00:00:33,590 --> 00:00:38,500
31
+ நாம் ஏன் <DT>merge</DT> செய்ய வேண்டும்? நாம் <DT>merge</DT> செய்ய வேண்டியதன் காரணம், நாம் <DT>merge sort </DT> ஐ செய்யும்போது,
32
+
33
+ 9
34
+ 00:00:38,500 --> 00:00:45,759
35
+ நம்மிடம் <DT>initial list</DT> உள்ளது. பின்னர் அதை இரண்டு பகுதிகளாக split செய்கிறோம். ஆனால், பொதுவாக <DT>left</DT> இலிருந்து <DT>items</DT> கள் இருக்கலாம்.
36
+
37
+ 10
38
+ 00:00:45,759 --> 00:00:50,409
39
+ <DNT>right</DNT> இலிருந்து <DT>bigger than items</DT>. எனவே, <DT>instance</DT> ஆக நாம் சொன்னால்,
40
+
41
+ 11
42
+ 00:00:50,450 --> 00:00:54,250
43
+ <DT>left</DT> ல் <DT>even numbers</DT> மற்றும் <DNT>right</DNT> ல் <DT>odd numbers</DT>.
44
+
45
+ 12
46
+ 00:00:54,550 --> 00:00:58,900
47
+ இரண்டு பக்கங்களிலிருந்தும் <DT>numbers alternately</DT> எடுத்துக்கொண்டு <DT>merge</DT> செய்ய வேண்டும்.
48
+
49
+ 13
50
+ 00:00:59,630 --> 00:01:09,646
51
+ <DT>divided problem</DT> ன் <DT>left</DT> பக்கத்தில் உள்ள அனைத்தும் <DT>divided problem</DT> ன் <DNT>வலது</DNT> பக்கத்தில் உள்ள அனைத்தையும் விட சிறியதாக இருக்கும்படி <DT>arrange</DT> செய்தால்,
52
+
53
+ 14
54
+ 00:01:10,593 --> 00:01:12,146
55
+ பின்னர், நாம் அனைத்தையும் <DT>merge</DT> செய்ய தேவையில்லை.
56
+
57
+ 15
58
+ 00:01:12,699 --> 00:01:18,130
59
+ மேலும் இது <DT>merge</DT> செய்வதற்கு, கூடுதல் space தேவைப்படும் <DT>problem</DT> ஐ தவிர்க்கலாம்.
60
+
61
+ 16
62
+ 00:01:20,689 --> 00:01:23,702
63
+ <DT>merge</DT> இல்லாமல் எப்படி <DT>divide</DT> மற்றும் <DT>conquer</DT> செய்வது.
64
+
65
+ 17
66
+ 00:01:25,243 --> 00:01:27,659
67
+ <DT>median value</DT> நமக்குத் தெரியும் என்று வைத்துக்கொள்வோம்.
68
+
69
+ 18
70
+ 00:01:27,659 --> 00:01:33,716
71
+ ஒரு <DT>set</DT> ல் உள்ள <DT>median value</DT> என்பது <DT>half</DT> the <DT>elements</DT> are <DT>smaller than half</DT> are <DT>bigger</DT> ஆக இருக்கும் <DT>value</DT> என்பதை நினைவில் கொள்ளுங்கள்.
72
+
73
+ 19
74
+ 00:01:35,649 --> 00:01:42,124
75
+ <DT>median</DT> விட <DT>smaller than</DT> <DT>values</DT> அனைத்தையும் <DT>left half</DT> க்கும், <DT>median</DT> விட <DT>bigger than</DT> அனைத்தையும் <DNT>right half</DNT> க்கும் நகர்த்தலாம்.
76
+
77
+ 20
78
+ 00:01:43,883 --> 00:01:52,180
79
+ நாம் பார்ப்பது போல, <DT>list</DT> ன் <DT>length</DT> க்கு <DT>time proportional</DT> ஆக புதிய <DT>array</DT> வை உருவாக்காமல் இதைச் செய்யலாம்.
80
+
81
+ 21
82
+ 00:01:53,816 --> 00:02:00,989
83
+ இந்த <DT>rearrangement</DT> ஐ செய்த பிறகு, அனைத்து <DT>smaller values</DT> களையும் <DT>left half</DT> க்கும் <DT>bigger values</DT> களை <DNT>right half</DNT> க்கும் நகர்த்தவும்.
84
+
85
+ 22
86
+ 00:02:00,989 --> 00:02:06,443
87
+ இந்த <DT>divide</DT> மற்றும் <DT>conquer strategy</DT> ஐ நாம் <DT>recursively</DT> பயன்படுத்தலாம். மேலும் <DNT>right</DNT> மற்றும் <DT>left half</DT> ஐ தனித்தனியாக <DT>sort</DT> செய்யலாம்.
88
+
89
+ 23
90
+ 00:02:07,519 --> 00:02:12,520
91
+ மேலும் <DT>left half</DT> ல் உள்ள அனைத்தும், <DNT>right half</DNT> ல் உள்ள அனைத்தையும் விட <DT>சிறியது</DT> என்று நாம் உத்தரவாதம் அளித்துள்ளோம்.
92
+
93
+ 24
94
+ 00:02:13,019 --> 00:02:17,050
95
+ இது தானாகவே இதற்கு அர்த்தம் <DT>divide</DT> மற்றும் <DT>conquer</DT> step க்கு பிறகு,
96
+
97
+ 25
98
+ 00:02:17,050 --> 00:02:24,442
99
+ <DT>left half</DT> ஏற்கனவே <DNT>right half</DNT> க்கு கீழே இருப்பதால், non-trivial முறையில் answers களை combine செய்ய வேண்டிய அவசியமில்லை. நாம் <DT>merge</DT> செய்ய தேவையில்லை.
100
+
101
+ 26
102
+ 00:02:28,309 --> 00:02:34,210
103
+ இந்த <DT>strategy</DT> ஐ பயன்படுத்தினால், <DT>merge sort </DT> போன்ற ஒரு <DT>recursive equation</DT> ஐ பெறுவோம்.
104
+
105
+ 27
106
+ 00:02:34,210 --> 00:02:42,370
107
+ <DNT>length n</DNT> இன் <DT>list</DT> ஐ <DT>sort</DT> செய்வதற்கு <DT>time</DT> தேவைப்படும். முதலில் <DNT>size n</DNT> இன் இரண்டு <DT>lists</DT> களை 2 ஆல் <DT>sort</DT> செய்ய வேண்டும்.
108
+
109
+ 28
110
+ 00:02:42,370 --> 00:02:50,039
111
+ நாம் <DNT>order n </DNT> ஐ செய்வோம் <DT>merging</DT> ஆக அல்ல. <DT>list</DT> ஐ <DT>decompose</DT> செய்வதற்காக. அதனால் அனைத்து <DT>smaller values</DT> களும் <DT>left</DT> மற்றும் <DNT>right</DNT> இல் இருக்கும்.
112
+
113
+ 29
114
+ 00:02:50,064 --> 00:02:54,483
115
+ நாம் <DT>recursive step</DT> செய்வதற்கு முன் rearranging <DT>step</DT> <DNT>order n</DNT> ஆகும்.
116
+
117
+ 30
118
+ 00:02:54,508 --> 00:02:57,879
119
+ அதேசமயம் <DT>merge</DT> என்பது <DT>recursive step</DT> க்கு பின் வரும் <DT>step</DT> ஆகும்.
120
+
121
+ 31
122
+ 00:02:57,879 --> 00:03:03,879
123
+ இது முந்தைய <DT>case</DT> ல் <DNT>order n</DNT> ஆக இருந்தது. ஆனால் நாம் <DT>recurrence</DT> ஐ <DT>solve</DT>செய்தால் அதே ஒன்றுதான். நமக்கு மற்றொரு <DNT>order n log n algorithm</DNT> கிடைக்கும்.
124
+
125
+ 32
126
+ 00:03:08,730 --> 00:03:12,340
127
+ இந்த <DT>approach</DT> இல் பெரிய <DT>bottleneck</DT> என்னவென்றால் <DT>median</DT> ஐ கண்டறிவதாகும்.
128
+
129
+ 33
130
+ 00:03:13,190 --> 00:03:20,663
131
+ ஒரு <DT>list</DT> ஐ <DT>sorting</DT> செய்வதன் நன்மைகளில் ஒன்று, <DT>sorting</DT> க்கு பின் <DT>median</DT> ஐ middle <DT>element</DT> ஆக நாம் அடையாளம் காணலாம் என்பதை நினைவில் கொள்ளுங்கள்.
132
+
133
+ 34
134
+ 00:03:21,890 --> 00:03:24,336
135
+ இப்போது, இங்கே நாம் <DT>sorting</DT> செய்வதற்கு முன் <DT>median</DT> ஐ கேட்கிறோம்.
136
+
137
+ 35
138
+ 00:03:24,996 --> 00:03:28,539
139
+ ஆனால், நமது நோக்கம் <DT>sort</DT> செய்வது. அது <DT>paradoxical</DT> ஆகும்.
140
+
141
+ 36
142
+ 00:03:28,539 --> 00:03:33,219
143
+ <DT>sorting</DT>ன் <DT>output</DT> <DT>sorting</DT> ஆன <DT>input</DT> ஆக இருக்க வேண்டும் என நாம் விரும்பினால்.
144
+
145
+ 37
146
+ 00:03:34,892 --> 00:03:42,580
147
+ எனவே, <DT>list</DT> ஐ <DNT>split</DNT> செய்து <DT>element</DT> ன் மிகவும் எளிமையான தேர்வு மூலம் <DT>strategy</DT> யை முயற்சிக்க வேண்டும் என்பதே இதன் பொருள்.
148
+
149
+ 38
150
+ 00:03:42,825 --> 00:03:46,780
151
+ <DT>median</DT> ஐ தேடுவதற்குப் பதிலாக, <DNT>list A</DNT> இல் சில <DT>value</DT> ஐ பெறுவோம்.
152
+
153
+ 39
154
+ 00:03:46,780 --> 00:03:49,689
155
+ மற்றும் <DT>pivot element</DT> என அழைக்கப்படுவதைப் பயன்படுத்தவும்.
156
+
157
+ 40
158
+ 00:03:49,689 --> 00:03:56,769
159
+ இந்த <DT>pivot</DT> ஐ பொறுத்து <DNT>A</DNT> என்று பிரிக்கிறோம். இதன���ல் அனைத்து <DT>smaller elements</DT> களும் <DT>left</DT> ஆகவும், <DT>bigger elements</DT> கள் அனைத்தும் <DNT>right</DNT> ஆகவும் இருக்கும்.
160
+
161
+ 41
162
+ 00:04:00,223 --> 00:04:11,636
163
+ இந்த <DT>algorithm</DT> <DT>quick sort</DT> என்று அழைக்கப்படுகிறது. இது 1960 களில் <DT>Tony Four</DT> என்ற நபரால் கண்டுபிடிக்கப்பட்டது மற்றும் இது மிகவும் பிரபலமான <DT>sorting algorithms</DT> களில் ஒன்றாகும்.
164
+
165
+ 42
166
+ 00:04:12,103 --> 00:04:16,082
167
+ பொதுவாக <DT>array</DT> இன் <DT>list</DT> ல் முதல் <DT>element</DT> ஆக இருக்கும் <DT>pivot element</DT> ஐ தேர்வு செய்கிறோம்.
168
+
169
+ 43
170
+ 00:04:16,759 --> 00:04:22,500
171
+ இந்த <DT>pivot</DT> இன் முடிவைப் பொறுத்து <DT>lower part</DT> லும் <DT>upper part</DT> லும் <DNT>partition A</DNT> செய்கிறோம்.
172
+
173
+ 44
174
+ 00:04:22,500 --> 00:04:24,943
175
+ எனவே, அனைத்து <DT>smaller elements</DT> களையும் <DT>left</DT> க்கு நகர்த்துகிறோம்.
176
+
177
+ 45
178
+ 00:04:25,056 --> 00:04:28,149
179
+ மற்றும் அனைத்து <DT> bigger elements</DT> முதல் <DNT>right</DNT> வரை <DT>pivotal</DT> தேர்வைப் பொறுத்து.
180
+
181
+ 46
182
+ 00:04:29,523 --> 00:04:34,163
183
+ இரண்டிற்கும் இடையே <DT>pivot</DT> வருவதை உறுதிசெய்கிறோம். ஏனெனில் <DT>array</DT> ல் முதல் <DT>element</DT> <DT>pivot</DT> ஆக எடுத்துள்ளோம்.
184
+
185
+ 47
186
+ 00:04:34,190 --> 00:04:41,036
187
+ இதற்குப் பிறகு நாம் அதை <DT>lower</DT> மற்றும் <DT>upper bound</DT> க்கு இடையில் உள்ள <DT>center</DT> க்கு நகர்த்த விரும்புகிறோம். பின்னர், இரண்டு <DT>partitions</DT> களை <DT>recursively sort</DT> செய்கிறோம்.
188
+
189
+ 48
190
+ 00:04:44,456 --> 00:04:48,910
191
+ ஒரு பொதுவான <DT>list</DT> ல் <DT>quick sort</DT> எவ்வாறு வேலை செய்யும் என்பது பற்றிய <DT>high level view</DT> இங்கே உள்ளது.
192
+
193
+ 49
194
+ 00:04:48,910 --> 00:04:56,143
195
+ இது தான் நமது <DT>list</DT> என்று வைத்துக்கொள்வோம். <DT>list</DT> ன் தொடக்கத்தை <DT>pivot element</DT> ஆக முதல் <DT>element</DT> ஐ அடையாளம் காண்போம்.
196
+
197
+ 50
198
+ 00:04:56,950 --> 00:05:01,569
199
+ இப்போது, மீதமுள்ள <DT>elements</DT> களில், எந்த <DNT>ones</DNT> <DT>smaller</DT> மற்றும் எந்த <DNT>ones</DNT> <DT>bigger</DT> என்பதைக் கண்டுபிடிக்க வேண்டும்.
200
+
201
+ 51
202
+ 00:05:02,410 --> 00:05:11,510
203
+ இதை எப்படிச் செய்வோம் என்று சொல்லாமல், 32, 22 மற்றும் 13 ஆகிய மூன்று <DT>elements</DT> களை <DT>smaller</DT> ஆகவும் <DNT>yellow</DNT> ல் <DT>marked </DT> செய்யபட்டதாகவும் அடையாளப்படுத்துகிறோம்.
204
+
205
+ 52
206
+ 00:05:11,810 --> 00:05:15,069
207
+ மற்றும் <DNT>green</DNT> இல் <DT>marked </DT> செய்யப்பட்ட மற்ற 4 <DT>elements</DT> கள் பெரியவை.
208
+
209
+ 53
210
+ 00:05:16,160 --> 00:05:20,040
211
+ முதல் <DT>step</DT> உண்மையில் இந்த <DT>criterion</DT> ஐ பொறுத்து <DT>partition</DT> செய்ய வேண்டும்.
212
+
213
+ 54
214
+ 00:05:20,040 --> 00:05:24,810
215
+ நாம் இந்த <DT>elements</DT> களை நகர்த்த வேண்டும். அதனால் அவை இரண்டு <DT>blocks</DT> ஆக வரும்.
216
+
217
+ 55
218
+ 00:05:24,810 --> 00:05:27,550
219
+ அந்த 13, 32 மற்றும் 22 <DT>left</DT> பக்கம் வரும்.
220
+
221
+ 56
222
+ 00:05:27,550 --> 00:05:33,430
223
+ 63 57, 91 மற்றும் 78, <DNT>right</DNT> மற்றும் <DT>pivot element</DT> 43 <DT>middle</DT> ல் வருகிறது.
224
+
225
+ 57
226
+ 00:05:33,947 --> 00:05:36,781
227
+ இது <DT>rearranging step</DT> மற்றும் இப்போது
228
+
229
+ 58
230
+ 00:05:37,060 --> 00:05:41,529
231
+ நாம் <DNT>yellow bits</DNT> மற்றும் <DNT>green bits</DNT> ஆகியவற்றை <DT>recursively sort</DT> செய்வோம். பிறகு அதைச் செய்யலாம் என்று கருதினால்,
232
+
233
+ 59
234
+ 00:05:41,529 --> 00:05:45,480
235
+ ந���்மிடம் ஒரு <DT>sorted array</DT> உள்ளது மற்றும் அனைத்து <DNT>yellow</DNT> பொருட்களும் <DT>smaller than </DT>43 ஆக இருப்பதை கவனிக்கவும்.
236
+
237
+ 60
238
+ 00:05:45,480 --> 00:05:49,509
239
+ மேலும் அனைத்து <DNT>green</DNT> விஷயங்களும் <DT>bigger than</DT> 43. மேலும் <DT>merging</DT> செய்ய தேவையில்லை.
240
+
241
+ 61
242
+ 00:05:52,243 --> 00:05:54,899
243
+ எனவே, <DT>partitioning</DT> எவ்வாறு செயல்படுகிறது என்பதைப் பார்ப்போம்.
244
+
245
+ 62
246
+ 00:05:54,899 --> 00:05:59,350
247
+ இங்கே நம்மிடம் முந்தைய <DT>list</DT> ல் உள்ளது. மேலும் 43 ஐ நமது <DT>pivot element</DT> ஆக <DT>marked </DT> செய்துள்ளோம்.
248
+
249
+ 63
250
+ 00:05:59,350 --> 00:06:03,112
251
+ மீதமுள்ள <DT>elements</DT> களை <DT>scan</DT> செய்து அவற்றை <DT>divide</DT> செய்ய விரும்புகிறோம்.
252
+
253
+ 64
254
+ 00:06:03,137 --> 00:06:08,742
255
+ இரண்டு குழுக்கள், <DT>smaller than</DT> 43, <DNT>yellow ones</DNT>, <DT>bigger than</DT> 43, <DNT>green ones</DNT> மற்றும் அவற்றை <DT>rearrange</DT> செய்யவும்.
256
+
257
+ 65
258
+ 00:06:09,962 --> 00:06:13,839
259
+ நாம் என்ன செய்வோம் இரண்டு <DT>pointers</DT> கள் <DNT>yellow pointer</DNT> மற்றும் <DNT>green pointer</DNT> ஐ வைத்திருப்போம்.
260
+
261
+ 66
262
+ 00:06:14,155 --> 00:06:19,081
263
+ மேலும் பொதுவான விதி என்னவென்றால், எந்த ஒரு <DT>point</DT>லும் நாம் சிறிது <DT>distance</DT> ல் இருப்போம்.
264
+
265
+ 67
266
+ 00:06:19,355 --> 00:06:24,129
267
+ நான் <DNT>orange</DNT> நிறத்தில் வரையப் போகும் <DT>visible</DT> <DNT>yellow pointer</DNT> மற்றும் <DNT>green pointer</DNT>.
268
+
269
+ 68
270
+ 00:06:24,129 --> 00:06:29,165
271
+ இவை இந்த <DT>order</DT> ல் நகரும் <DNT>orange pointer</DNT> அல்லது <DNT>yellow pointer</DNT> எப்போதும் <DNT>green pointer</DNT> பின்னால் இருக்கும்.
272
+
273
+ 69
274
+ 00:06:29,565 --> 00:06:35,397
275
+ நீங்கள் பராமரிக்கும் <DT>inductive property</DT> என்னவென்றால், இந்த <DT>elements</DT> கள் 43 ஐ விட <DT>smaller than</DT> அல்லது சமமாகவோ இருக்கும்.
276
+
277
+ 70
278
+ 00:06:35,910 --> 00:06:40,643
279
+ இந்த <DT>elements</DT> கள் <DT>bigger than</DT> 43 மற்றும் இந்த <DT>elements</DT> கள் <DT>தெரியவில்லை</DT>.
280
+
281
+ 71
282
+ 00:06:42,577 --> 00:06:46,139
283
+ நாம் செய்ய முயற்சிப்பது என்னவென்றால், <DT>left</DT> ல் இருந்து <DNT>right</DNT> க்கு நகர்த்த முயற்சிக்கிறோம்.
284
+
285
+ 72
286
+ 00:06:46,139 --> 00:06:49,589
287
+ ஒவ்வொரு முறையும் <DT>unknown elements</DT> ஐ காணும் அனைத்து <DT>unknown elements</DT> களையும் <DT>classify</DT> செய்யவும்.
288
+
289
+ 73
290
+ 00:06:49,552 --> 00:06:52,660
291
+ இந்த property ஐ நாம் maintain பண்ண இரண்டு <DT>pointers</DT> களை மாற்றுவோம்.
292
+
293
+ 74
294
+ 00:06:52,700 --> 00:06:57,699
295
+ 43 க்கும் முதல் <DT>pointer</DT> க்கும் இடையில் <DT>elements smaller than</DT> 43 அல்லது அதற்கு சமமாக உள்ளன.
296
+
297
+ 75
298
+ 00:06:57,699 --> 00:07:01,494
299
+ முதல் <DT>pointer</DT> க்கும் இரண்டாவது <DT>pointer</DT> க்கும் இடையில் நம் <DT>elements</DT> கள் கண்டிப்பாக 43 க்கு <DT>greater</DT> ஆக உள்ளது.
300
+
301
+ 76
302
+ 00:07:01,752 --> 00:07:05,230
303
+ மற்றும் <DNT>green pointer</DNT> இன் <DNT>right</DNT> பக்கம் இன்னும் <DT>scanned</DT> செய்யப்படாதவை உள்ளன.
304
+
305
+ 77
306
+ 00:07:07,023 --> 00:07:10,000
307
+ எனவே, ஆரம்பத்தில் எதுவும் தெரியவில்லை. பின்னர் நாம் 32 ஐ பார்க்கிறோம்.
308
+
309
+ 78
310
+ 00:07:10,000 --> 00:07:14,618
311
+ 32 43 ஐ விட <DT>smaller than</DT> ஆக இருப்பதால், <DNT>yellow pointer</DNT> ஐ நகர்த்துகிறோம். மேலும் <DNT>green pointer</DNT> ஐ உடன் தள்ளுகிறோம்.
312
+
313
+ 79
314
+ 00:07:14,643 --> 00:07:16,949
315
+ தெரியாத விஷயம் 22 இல் தொடங்குகிறது.
316
+
317
+ 80
318
+ 00:07:16,949 --> 00:07:22,060
319
+ <DNT>yellow</DNT> மற்றும் <DNT>green pointer</DNT> ஆகியவற்றுக்கு இடையே எதுவும் இல்லை. <DT>value bigger than</DT> 43 ஐ நாம் இன்னும் கண்டுபிடிக்கவில்லை.
320
+
321
+ 81
322
+ 00:07:22,949 --> 00:07:24,910
323
+ எனவே, 22 க்கும் அதே நடக்கும்.
324
+
325
+ 82
326
+ 00:07:24,910 --> 00:07:28,629
327
+ இப்போது, 78ஐ பார்க்கும்போது, 78 <DT>bigger than</DT> 43 என்பதைக் கவனிக்கிறோம்.
328
+
329
+ 83
330
+ 00:07:29,008 --> 00:07:33,635
331
+ இப்போது, நாம் <DNT>green pointer</DNT> ஐ மட்டுமே நகர்த்துகிறோம். மேலும் <DNT>yellow pointer</DNT> ஐ அல்ல. இப்போது, இந்த 3 இடைவெளிகளை முன்பு போலவே வைத்திருக்கிறோம்.
332
+
333
+ 84
334
+ 00:07:33,935 --> 00:07:36,819
335
+ இது 43 க்கு குறைவான <DT>equal</DT> ஆன பகுதி என்பதை நினைவில் கொள்ளுங்கள்.
336
+
337
+ 85
338
+ 00:07:36,819 --> 00:07:44,350
339
+ இது <DT>greater than</DT> 43 உள்ள பகுதி மற்றும் இந்த பகுதி unknown <DNT>right</DNT>, நாம் இந்த வழியில் தொடர்கிறோம்.
340
+
341
+ 86
342
+ 00:07:44,350 --> 00:07:48,189
343
+ இப்போது நாம் 63 ஐ பார்க்கிறோம். மீண்டும் 63 <DNT>green zone</DNT> ஐ நீட்டிக்கிறது.
344
+
345
+ 87
346
+ 00:07:48,189 --> 00:07:52,540
347
+ 57 ஒரு <DNT>green zone</DNT> ஐ நீட்டிக்கிறது 91 ஒரு <DNT>green zone</DNT> ஐ நீட்டிக்கிறது.
348
+
349
+ 88
350
+ 00:07:52,540 --> 00:07:56,470
351
+ இப்போது, 13 ஐ கண்டுபிடிக்கும்போது நாம் ஏதாவது செய்ய வேண்டும்.
352
+
353
+ 89
354
+ 00:07:56,470 --> 00:08:00,100
355
+ 13 என்பது இப்போது <DNT>yellow zone</DNT> ல் சேர்க்கப்பட வேண்டிய ஒரு <DT>element</DT>.
356
+
357
+ 90
358
+ 00:08:00,205 --> 00:08:03,705
359
+ ஒரு <DT>strategy</DT> நிறைய மாற்றங்களைச் செய்ய வேண்டும்.
360
+
361
+ 91
362
+ 00:08:03,730 --> 00:08:07,360
363
+ நாம் 13 ஐ 22 இருக்கும் இடத்திற்கு அல்லது 22 க்குப் பிறகு நகர்த்துகிறோம்.
364
+
365
+ 92
366
+ 00:08:07,360 --> 00:08:10,180
367
+ மேலும் 78 இல் இருந்து எல்லாவற்றையும் <DNT>right</DNT> க்கு தள்ளுகிறோம்.
368
+
369
+ 93
370
+ 00:08:10,250 --> 00:08:15,220
371
+ ஆனால் உண்மையில், ஒரு புத்திசாலித்தனமான <DT>strategy</DT> என்னவென்றால், 13 இங்கே செல்ல வேண்டும் என்று சொல்வது.
372
+
373
+ 94
374
+ 00:08:17,605 --> 00:08:21,519
375
+ நாம் space ஐ உருவாக்க வேண்டும். ஆனால் <DT>space</DT> ஐ உருவாக்குவதற்கு பதிலாக.
376
+
377
+ 95
378
+ 00:08:21,519 --> 00:08:30,399
379
+ எப்படியும் <DNT>green</DNT> விஷயங்களை நாம் <DT>sort</DT> செய்யபோகிறோம். அது ஒரு பொருட்டல்ல என்று சொல்லலாம். இரண்டையும் எந்த வழியில் <DT>sort</DT> செய்கிறோம் என்பது எப்படி முக்கியம். இந்த 78ஐ எடுத்து 13க்கு நகர்த்துவோம்.
380
+
381
+ 96
382
+ 00:08:30,399 --> 00:08:33,009
383
+ எந்த மாற்றத்தையும் செய்வதற்கு பதிலாக.
384
+
385
+ 97
386
+ 00:08:33,009 --> 00:08:36,370
387
+ <DNT>green</DNT> zone ல் முதல் <DT>element</DT> ஐ <DT>exchange</DT> செய்கிறோம்.
388
+
389
+ 98
390
+ 00:08:36,370 --> 00:08:38,320
391
+ நாம் இதுவரை பார்க்கும் <DT>element</DT> உடன்.
392
+
393
+ 99
394
+ 00:08:38,320 --> 00:08:41,980
395
+ அது தானாகவே <DNT>yellow zone</DNT> மற்றும் <DNT>green zone</DNT> இரண்டையும் சரியாக நீட்டிக்கும்.
396
+
397
+ 100
398
+ 00:08:42,080 --> 00:08:49,299
399
+ நமது அடுத்த <DT>step</DT> 13 <DT>smaller than</DT> 43 என்பதை கண்டறிந்து, அதை 73 உடன் <DT>இடமாற்று</DT> செய்வது.
400
+
401
+ 101
402
+ 00:08:49,399 --> 00:08:54,070
403
+ இப்போது, நம்மிடம் உள்ள <DT>pivot</DT> ன் <DNT>right</DNT> க்கு ஒரு <DT>intermediate stage</DT> ஐ அடைந்துள்ளோம்.
404
+
405
+ 102
406
+ 00:08:54,070 --> 00:08:58,360
407
+ எல்லாவற்றையும் scanned செய்து, அவற்றை <DT>smaller</DT> ஆக வகைப்படுத்தியுள்ளோம்.
408
+
409
+ 103
410
+ 00:08:58,360 --> 00:08:59,889
411
+ மற்றும் <DT>bigger</DT> ஐயும்.
412
+
413
+ 104
414
+ 00:09:00,716 --> 00:09:04,216
415
+ இப்போது, <DNT>yellow</DNT> விஷயங்களை 43க்கு <DT>left</DT> பக்கம் <DT>push</DT> செய்ய வேண்டும்.
416
+
417
+ 105
418
+ 00:09:05,036 --> 00:09:09,165
419
+ இப்போது, <DNT>yellow zone</DNT> ல் 13ஐ சேர்த்தபோது பார்த்த அதே <DT>problem</DT> மீண்டும் ஒருமுறை நமக்கு வந்துள்ளது.
420
+
421
+ 106
422
+ 00:09:09,190 --> 00:09:13,210
423
+ நாம் 43 ஐ சரியான இடத்திற்கு நகர்த்தினால், இங்கே அனைத்தையும் <DNT>left</DNT> க்கு நகர்த்த வேண்டும்.
424
+
425
+ 107
426
+ 00:09:13,404 --> 00:09:18,940
427
+ ஆனால், அதற்குப் பதிலாக இந்த 13ஐ <DNT>yellow zone</DNT> ல் கடைசி <DT>element</DT> ஆக எடுத்துக்கொள்ளலாம்.
428
+
429
+ 108
430
+ 00:09:18,940 --> 00:09:22,149
431
+ மற்றும் அதை அங்கே <DT>replace</DT> செய்யவும். 32 மற்றும் 22 ஐ shift செய்ய வேண்டாம்.
432
+
433
+ 109
434
+ 00:09:22,149 --> 00:09:26,759
435
+ இது <DT>order</DT> ஐ சீர்குலைக்கிறது. ஆனால் எப்படியும் இது <DT>unsorted</DT> செய்யாமல், <DT>unsorted</DT> ஆக உள்ளது.
436
+
437
+ 110
438
+ 00:09:27,632 --> 00:09:29,889
439
+ நாம் இதை செய்கிறோம். இப்போது நம்மிடம் உள்ளது.
440
+
441
+ 111
442
+ 00:09:30,001 --> 00:09:36,171
443
+ நாம் விரும்பியபடி <DT>array rearranged</DT> செய்யப்பட்டது. எனவே, <DT>left</DT> ல் உள்ள இவை அனைத்தும் <DT>smaller than</DT> <DT>pivot</DT>.
444
+
445
+ 112
446
+ 00:09:37,244 --> 00:09:41,856
447
+ <DT>pivot</DT> நடுவில் உள்ளது. மற்றும் <DNT>right</DNT> ல் உள்ள அனைத்தும் <DT>bigger than</DT> <DT>pivot</DT>.
448
+
449
+ 113
450
+ 00:09:46,550 --> 00:09:53,830
451
+ இங்கே <DT>python</DT> இன் ஒரு <DT>implementation</DT> உள்ளது. <DT>quick sort</DT> என்பது <DT>merge sort </DT> மற்றும் <DT>binary research</DT> போன்றவற்றைக் கொண்டிருக்கும் என்பதை நினைவில் கொள்ளவும்.
452
+
453
+ 114
454
+ 00:09:53,830 --> 00:09:58,690
455
+ <DT>smaller</DT> மற்றும் <DT>smaller segments</DT> ல் அதை மீண்டும் மீண்டும் பயன்படுத்துகிறோம். பொதுவாக நாம் அதை <DT>pass</DT> செய்யவும்.
456
+
457
+ 115
458
+ 00:09:58,690 --> 00:10:03,523
459
+ நாம் <DNT>call A</DNT> என்ற <DT>list</DT> க்கும், <DT>segment</DT> ன் <DT>end points</DT> ஆன <DNT>left</DNT> மற்றும் <DNT>right</DNT>.
460
+
461
+ 116
462
+ 00:10:03,548 --> 00:10:07,238
463
+ நாம் ஒரு <DNT>slice l </DNT> முதல் <DNT>r minus 1</DNT> வரை செய்கிறோம்.
464
+
465
+ 117
466
+ 00:10:08,244 --> 00:10:13,210
467
+ இந்த <DT>slice</DT> 1 அல்லது 0 <DT>length</DT> ஆக இருந்தால், நாம் எதுவும் செய்ய மாட்டோம்.
468
+
469
+ 118
470
+ 00:10:14,223 --> 00:10:17,320
471
+ இல்லையெனில், நாம் முன்பு இருந்த இந்த <DT>partitioning strategy</DT> ஐ பின்பற்றுவோம்.
472
+
473
+ 119
474
+ 00:10:17,708 --> 00:10:22,120
475
+ அதாவது <DNT>l</DNT> இலிருந்து <DNT>r minus 1</DNT> வரை <DT>sorting</DT> செய்கிறோம்.
476
+
477
+ 120
478
+ 00:10:22,120 --> 00:10:24,220
479
+ எனவே, <DT>position l</DT>.
480
+
481
+ 121
482
+ 00:10:24,379 --> 00:10:25,899
483
+ இது <DT>pivot</DT> ஆகும்.
484
+
485
+ 122
486
+ 00:10:26,793 --> 00:10:29,671
487
+ <DNT>right</DNT> முதலில் இங்கே <DNT>yellow pointer</DNT> ஐ வைப்போம்.
488
+
489
+ 123
490
+ 00:10:31,011 --> 00:10:33,635
491
+ <DNT>yellow zone</DNT> இன் முடிவு என்று கூறுகிறது.
492
+
493
+ 124
494
+ 00:10:34,005 --> 00:10:38,500
495
+ உண்மையில் <DT>pivot</DT> உள்ளது அங்கு எதுவும் இல்லை. <DNT>yellow</DNT> என்பது <DNT>l plus 1</DNT> ஆகும்.
496
+
497
+ 125
498
+ 00:10:38,500 --> 00:10:50,781
499
+ இப்போது <DNT>green</DNT>ஐ தொடர அனுமதிக்கிறோம். ஒவ்வொரு <DT>time</DT>ம் <DNT>green</DNT> இல் ஒரு <DT>element</DT> ஐ பார்க்கும்போது புதிய <DNT>green</DNT> ஒன்���ைக் காட்டிலும் <DT>smaller than</DT> ஆக இருக்கும் <DT>pivot</DT> ஆகும். இது <DT>pivot</DT> என்பதை நினைவில் கொள்ளுங்கள்.
500
+
501
+ 126
502
+ 00:10:51,965 --> 00:10:55,661
503
+ <DNT>right</DNT> நாம் எப்போதாவது ஒரு <DNT>green</DNT> ஐ பார்த்தால், அடுத்த <DT>value</DT> ஐ.
504
+
505
+ 127
506
+ 00:10:55,686 --> 00:10:57,580
507
+ சரிபார்க்கப்பட வேண்டியதை விட <DT>smaller than</DT> அல்லது சமமானது.
508
+
509
+ 128
510
+ 00:10:57,590 --> 00:11:01,714
511
+ நாம் <DT>exchange</DT> செய்கிறோம். இதனால் இந்த <DT>value</DT> ஐ <DNT>yellow zone</DNT> ன் முடிவுக்குக் கொண்டு வருகிறோம்.
512
+
513
+ 129
514
+ 00:11:01,739 --> 00:11:03,220
515
+ இதைத்தான் 13ல் செய்தோம்.
516
+
517
+ 130
518
+ 00:11:03,344 --> 00:11:07,590
519
+ பின்னர், <DNT>yellow pointer</DNT> ஐ நகர்த்துகிறோம். இல்லையெனில் கண்டிப்பாக <DT>bigger</DT> <DT>value</DT> ஐ கண்டால் நகர்த்துவோம்.
520
+
521
+ 131
522
+ 00:11:07,590 --> 00:11:11,860
523
+ <DNT>green pointer</DNT> மட்டுமே <DT>for loop</DT> ஆல் மறைமுகமாக செய்யப்படுகிறது. மற்றொன்றை நகர்த்த மாட்டோம்.
524
+
525
+ 132
526
+ 00:11:11,929 --> 00:11:14,883
527
+ இதன் முடிவில் நமக்கு <DT>pivot</DT> உள்ளது.
528
+
529
+ 133
530
+ 00:11:15,894 --> 00:11:19,784
531
+ நாம் <DT>pivot</DT> க்கு சமமானதைக் காட்டிலும் குறைவானதைக் கொண்டுள்ளோம். பின்னர் <DT>greater than pivot</DT> ம் கொண்டுள்ளோம்.
532
+
533
+ 134
534
+ 00:11:19,809 --> 00:11:27,914
535
+ இந்த விதியின் முடிவில் நாம் அடைந்த அந்த intermediate stage இதுதான். இப்போது, நாம் <DT>pivot</DT> ஐ கண்டுபிடித்து சரியான இடத்திற்கு நகர்த்த வேண்டும். எனவே, <DNT>yellow</DNT> என்பதை நினைவில் கொள்ளுங்கள்.
536
+
537
+ 135
538
+ 00:11:29,241 --> 00:11:32,769
539
+ <DNT>yellow</DNT> <DNT>last</DNT> க்கு அப்பால் உள்ள <DT>position</DT> ஐ சுட்டிக்காட்டுகிறது.
540
+
541
+ 136
542
+ 00:11:32,769 --> 00:11:37,440
543
+ <DT>element அதை விட சிறியது</DT>. <DNT>yellow</DNT> இதற்கு முன் எப்போதும் ஒரு <DT>value</DT> ஆகும்.
544
+
545
+ 137
546
+ 00:11:37,440 --> 00:11:40,396
547
+ <DNT>yellow</DNT> minus 1 இன் <DT>value</DT> ஐ எடுத்து, <DT>left value</DT> உடன் <DT>exchange</DT> செய்வோம்.
548
+
549
+ 138
550
+ 00:11:41,414 --> 00:11:48,765
551
+ இப்போது நாம் செய்ய வேண்டியது என்னவென்றால், நம்மிடம் இப்போது <DNT> p, p and greater than p</DNT> ஐ விட குறைவாக உள்ளது.
552
+
553
+ 139
554
+ 00:11:49,627 --> 00:12:01,350
555
+ இங்குதான் <DNT>yellow</DNT> <DNT>சரியானது</DNT>. நாம் 0 இலிருந்து <DNT>yellow</DNT> minus 1 க்கு செல்ல வேண்டும். மீண்டும் <DNT>sort p </DNT> ஐ விரும்பவில்லை. ஏனெனில் <DNT>p</DNT> ஏற்கனவே சரியான இடத்தில் வைக்கப்பட்டுள்ளது.
556
+
557
+ 140
558
+ 00:12:01,350 --> 00:12:06,391
559
+ <DNT>L</DNT> இலிருந்து <DNT>yellow</DNT> minus 1 ஆகவும், <DNT>yellow</DNT> இலிருந்து <DNT>right</DNT> முனையிலும் <DT>quick sort</DT> செய்வோம்.
560
+
561
+ 141
562
+ 00:12:13,070 --> 00:12:17,070
563
+ <DT>slide</DT> ல் பார்த்த <DT>python code</DT> ஐ இங்கே ஒரு <DT>file</DT> ல் எழுதியுள்ளோம்.
564
+
565
+ 142
566
+ 00:12:17,070 --> 00:12:20,320
567
+ slide ல் இருந்த அதே <DT>code</DT> இதுதானா என்பதை சரிபார்க்கலாம்.
568
+
569
+ 143
570
+ 00:12:20,345 --> 00:12:28,786
571
+ நாம் அதை முயற்சி செய்து <DT>run</DT> செய்யலாம் மற்றும் அது செயல்படுகிறதா என்று சரிபார்க்கலாம். <DT>call python</DT>, இந்த <DT>function</DT> ஐ <DT>import</DT> செய்கிறோம்.
572
+
573
+ 144
574
+ 00:12:32,849 --> 00:12:37,699
575
+ இது மீண்டும் ஒரு வகையான <DT>sorts</DT> <DT>function</DT> என்பதை நினைவில் கொள்ளுங்கள். எதையாவது <DT>sort</DT> செய்து அதன் விளைவைப் பார்க்க விரும்பினால்.
576
+
577
+ 145
578
+ 00:12:37,753 --> 00:12:40,870
579
+ நாம் அதற்கு ஒரு <DT>name</DT> ஐ <DT>assign</DT> செய்ய வேண்டும். பின்னர் அந்த <DT>name</DT> ஐ <DT>sort</DT> செய்து, பிறகு <DT>name</DT> ஐ சரிபார்க்க வேண்டும்.
580
+
581
+ 146
582
+ 00:12:40,909 --> 00:12:48,137
583
+ எடுத்துக்காட்டாக, 500 முதல் 0 வரையிலான <DT>range</DT> of <DT>values</DT> ஐ எடுத்துக் கொள்வோம்.
584
+
585
+ 147
586
+ 00:12:50,287 --> 00:12:58,090
587
+ இப்போது நாம் <DNT>quicksort l</DNT> என்று சொன்னால், அதற்கு <DNT>of course</DNT> முடிவைக் கொடுக்க வேண்டும்.
588
+
589
+ 148
590
+ 00:13:01,020 --> 00:13:02,468
591
+ பிறகு <DNT>l</DNT> சரியாக <DT>sorted</DT> செய்யப்படும்.
592
+
593
+ 149
594
+ 00:13:04,311 --> 00:13:09,523
595
+ நீங்கள் அனைத்தையும் பார்க்க முடியாது. ஆனால் 83 84 முதல் நூறு வரை மற்றும் இரண்டு 500 வரை பார்க்க முடியும்.
596
+
597
+ 150
598
+ 00:13:10,995 --> 00:13:16,480
599
+ இப்போது, 1000 என்று சொன்னால், <DT>insertion sort</DT> ல் நமக்கு இருந்த அதே <DT>problem</DT> உள்ளது.
600
+
601
+ 151
602
+ 00:13:17,897 --> 00:13:22,596
603
+ பின்னர் நாம் இதை <DT>quicksort</DT> செய்ய முயற்சிக்கிறோம். நீங்கள் இதை <DT>recursion depth</DT> ஆல் பெறுவீர்கள்.
604
+
605
+ 152
606
+ 00:13:22,621 --> 00:13:29,644
607
+ <DT>worst case</DT> ல் நாம் பார்ப்பது போல, <DT>quick sort</DT> ஆனது <DT>insertion sort</DT> ஐ போலவே செயல்படுகிறது மற்றும் இது மோசமான case.
608
+
609
+ 153
610
+ 00:13:29,669 --> 00:13:33,759
611
+ இதைப் போக்க, நாம் வழக்கமான காரியத்தைச் செய்ய வேண்டும். <DT>SYS module</DT> ஐ <DT>import</DT> செய்ய வேண்டும்.
612
+
613
+ 154
614
+ 00:13:33,759 --> 00:13:35,409
615
+ <DT>recursion limit</DT> ஐ <DT>set</DT> செய்யவும்.
616
+
617
+ 155
618
+ 00:13:36,658 --> 00:13:43,652
619
+ எனவே, பொருத்தமான பெரிய ஒன்று பத்தாயிரம் அல்லது நூறாயிரம் என்று சொல்லுங்கள். பின்னர் அதை <DT>quicksort</DT> செய்ய சொன்னால் எந்த problem உம் இல்லை.
620
+
621
+ 156
622
+ 00:13:44,779 --> 00:13:49,299
623
+ <DT>python</DT> ல் இந்த <DT>recursion limit</DT> ஐ manually set செய்ய வேண்டிய மற்றொரு case இதுவாகும்.
624
+
625
+ 157
626
+ 00:13:49,647 --> 00:13:56,929
627
+ உண்மையில் நாம் பார்க்கக்கூடிய ஒரு விஷயம் என்னவென்றால், <DT>quicksort</DT> என்பது நாம் நம்புவது போல் நல்லதல்ல, ஏனெனில்.
628
+
629
+ 158
630
+ 00:13:57,008 --> 00:14:02,080
631
+ எடுத்துக்காட்டாக, 7500 என்று ஏதாவது <DT>size</DT> ஐ <DT>instance sort</DT> செய்யவும்.
632
+
633
+ 159
634
+ 00:14:05,504 --> 00:14:09,554
635
+ பின்னர் அது ஒரு புலப்படும் நேரம் எடுக்கும். எனவே, <DNT>n log n</DNT> என்று <DT>merge sort </DT> ஐ பார்த்தோம்.
636
+
637
+ 160
638
+ 00:14:09,790 --> 00:14:13,700
639
+ 5,000 மற்றும் 10000 மற்றும் 100,000 கூட <DT>instantaneously</DT> செய்யும்.
640
+
641
+ 161
642
+ 00:14:13,832 --> 00:14:18,129
643
+ தெளிவாக <DT>quick sort</DT> மற்றும் <DT>merge sort </DT> செயல்படாது.
644
+
645
+ 162
646
+ 00:14:18,165 --> 00:14:22,480
647
+ மற்றும் உண்மையில் <DT>quick sort</DT> க்கு <DT>order</DT> <DNT>n log n</DNT> <DT>merge sort </DT> இல்லை என்பதை நாம் பார்ப்போம்.
648
+
649
+ 163
650
+ 00:14:22,511 --> 00:14:25,090
651
+ நாம் விரும்பியபடி நடத்தை.
652
+
653
+ 164
654
+ 00:14:25,090 --> 00:14:28,539
655
+ அதற்குக் காரணம், நாம் <DT>median</DT> ஐ பயன்படுத்தாமல், split செய்வதற்கான முதல் <DT>value</DT> ஐ பயன்படுத்துகிறோம்.
656
+
657
+ 165
658
+ 00:14:28,539 --> 00:14:33,909
659
+ அதை அடுத்த lecture ல் பார்ப்போம். ஏன் <DT>quick sort</DT> ல் உண்மையி���் ஒரு worst case <DNT>order n log n algorithm</DNT> அல்ல.
Translated_SRT/Week4_Lecture3_Cleaned_Tagged.ta.srt ADDED
@@ -0,0 +1,660 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 1
2
+ 00:00:02,246 --> 00:00:06,190
3
+ <DT>merge sort </DT> என்பது <DT>order</DT> <DNT>n log n</DNT> <DT>sorting algorithm</DT> என்று பார்த்தோம்.
4
+
5
+ 2
6
+ 00:00:06,190 --> 00:00:10,509
7
+ ஆனால் இது சில குறைபாடுகளைக் கொண்டுள்ளது. இது சில நேரங்களில் <DT>impractical</DT> ஆகிறது.
8
+
9
+ 3
10
+ 00:00:10,849 --> 00:00:14,740
11
+ முக்கிய பிரச்சனை என்னவென்றால், <DT>merging</DT> க்கு <DT>extra space</DT> தேவைப்படுகிறது.
12
+
13
+ 4
14
+ 00:00:14,869 --> 00:00:19,076
15
+ <DT>recursion</DT> ஐ பயன்படுத்தாமல் <DT>implement merge sort </DT> செய்வது கடினம் என்பதையும் நாம் பார்த்தோம்.
16
+
17
+ 5
18
+ 00:00:19,101 --> 00:00:22,108
19
+ மற்றும் <DT>recursion</DT> <DT>programming language</DT> ல் அதன் சொந்த செலவைக் கொண்டுள்ளது.
20
+
21
+ 6
22
+ 00:00:24,841 --> 00:00:26,952
23
+ எனவே, <DT>space problem</DT> ஐ தீர்க்கலாம்.
24
+
25
+ 7
26
+ 00:00:27,736 --> 00:00:33,310
27
+ <DT>merge function</DT> ஐ <DT>implement</DT> செய்யும் <DT>பொருட்டு</DT>, <DT>merge sort </DT> க்கு <DT>extra space</DT> தேவைப்படுகிறது.
28
+
29
+ 8
30
+ 00:00:33,590 --> 00:00:38,500
31
+ நாம் ஏன் <DT>merge</DT> செய்ய வேண்டும்? நாம் <DT>merge</DT> செய்ய வேண்டியதன் காரணம், நாம் <DT>merge sort </DT> ஐ செய்யும்போது,
32
+
33
+ 9
34
+ 00:00:38,500 --> 00:00:45,759
35
+ நம்மிடம் <DT>initial list</DT> உள்ளது. பின்னர் அதை இரண்டு பகுதிகளாக split செய்கிறோம். ஆனால், பொதுவாக <DT>left</DT> இலிருந்து <DT>items</DT> கள் இருக்கலாம்.
36
+
37
+ 10
38
+ 00:00:45,759 --> 00:00:50,409
39
+ <DNT>right</DNT> இலிருந்து <DT>bigger than items</DT>. எனவே, <DT>instance</DT> ஆக நாம் சொன்னால்,
40
+
41
+ 11
42
+ 00:00:50,450 --> 00:00:54,250
43
+ <DT>left</DT> ல் <DT>even numbers</DT> மற்றும் <DNT>right</DNT> ல் <DT>odd numbers</DT>.
44
+
45
+ 12
46
+ 00:00:54,550 --> 00:00:58,900
47
+ இரண்டு பக்கங்களிலிருந்தும் <DT>numbers alternately</DT> எடுத்துக்கொண்டு <DT>merge</DT> செய்ய வேண்டும்.
48
+
49
+ 13
50
+ 00:00:59,630 --> 00:01:09,646
51
+ <DT>divided problem</DT> ன் <DT>left</DT> பக்கத்தில் உள்ள அனைத்தும் <DT>divided problem</DT> ன் <DNT>வலது</DNT> பக்கத்தில் உள்ள அனைத்தையும் விட சிறியதாக இருக்கும்படி <DT>arrange</DT> செய்தால்,
52
+
53
+ 14
54
+ 00:01:10,593 --> 00:01:12,146
55
+ பின்னர், நாம் அனைத்தையும் <DT>merge</DT> செய்ய தேவையில்லை.
56
+
57
+ 15
58
+ 00:01:12,699 --> 00:01:18,130
59
+ மேலும் இது <DT>merge</DT> செய்வதற்கு, கூடுதல் space தேவைப்படும் <DT>problem</DT> ஐ தவிர்க்கலாம்.
60
+
61
+ 16
62
+ 00:01:20,689 --> 00:01:23,702
63
+ <DT>merge</DT> இல்லாமல் எப்படி <DT>divide</DT> மற்றும் <DT>conquer</DT> செய்வது.
64
+
65
+ 17
66
+ 00:01:25,243 --> 00:01:27,659
67
+ <DT>median value</DT> நமக்குத் தெரியும் என்று வைத்துக்கொள்வோம்.
68
+
69
+ 18
70
+ 00:01:27,659 --> 00:01:33,716
71
+ ஒரு <DT>set</DT> ல் உள்ள <DT>median value</DT> என்பது <DT>half</DT> the <DT>elements</DT> are <DT>smaller than half</DT> are <DT>bigger</DT> ஆக இருக்கும் <DT>value</DT> என்பதை நினைவில் கொள்ளுங்கள்.
72
+
73
+ 19
74
+ 00:01:35,649 --> 00:01:42,124
75
+ <DT>median</DT> விட <DT>smaller than</DT> <DT>values</DT> அனைத்தையும் <DT>left half</DT> க்கும், <DT>median</DT> விட <DT>bigger than</DT> அனைத்தையும் <DNT>right half</DNT> க்கும் நகர்த்தலாம்.
76
+
77
+ 20
78
+ 00:01:43,883 --> 00:01:52,180
79
+ நாம் பார்ப்பது போல, <DT>list</DT> ன் <DT>length</DT> க்கு <DT>time proportional</DT> ஆக புதிய <DT>array</DT> வை உருவாக்காமல் இதைச் செய்யலாம்.
80
+
81
+ 21
82
+ 00:01:53,816 --> 00:02:00,989
83
+ இந்த <DT>rearrangement</DT> ஐ செய்த பிறகு, அனைத்து <DT>smaller values</DT> களையும் <DT>left half</DT> க்கும் <DT>bigger values</DT> களை <DNT>right half</DNT> க்கும் நகர்த்தவும்.
84
+
85
+ 22
86
+ 00:02:00,989 --> 00:02:06,443
87
+ இந்த <DT>divide</DT> மற்றும் <DT>conquer strategy</DT> ஐ நாம் <DT>recursively</DT> பயன்படுத்தலாம். மேலும் <DNT>right</DNT> மற்றும் <DT>left half</DT> ஐ தனித்தனியாக <DT>sort</DT> செய்யலாம்.
88
+
89
+ 23
90
+ 00:02:07,519 --> 00:02:12,520
91
+ மேலும் <DT>left half</DT> ல் உள்ள அனைத்தும், <DNT>right half</DNT> ல் உள்ள அனைத்தையும் விட <DT>சிறியது</DT> என்று நாம் உத்தரவாதம் அளித்துள்ளோம்.
92
+
93
+ 24
94
+ 00:02:13,019 --> 00:02:17,050
95
+ இது தானாகவே இதற்கு அர்த்தம் <DT>divide</DT> மற்றும் <DT>conquer</DT> step க்கு பிறகு,
96
+
97
+ 25
98
+ 00:02:17,050 --> 00:02:24,442
99
+ <DT>left half</DT> ஏற்கனவே <DNT>right half</DNT> க்கு கீழே இருப்பதால், non-trivial முறையில் answers களை combine செய்ய வேண்டிய அவசியமில்லை. நாம் <DT>merge</DT> செய்ய தேவையில்லை.
100
+
101
+ 26
102
+ 00:02:28,309 --> 00:02:34,210
103
+ இந்த <DT>strategy</DT> ஐ பயன்படுத்தினால், <DT>merge sort </DT> போன்ற ஒரு <DT>recursive equation</DT> ஐ பெறுவோம்.
104
+
105
+ 27
106
+ 00:02:34,210 --> 00:02:42,370
107
+ <DNT>length n</DNT> இன் <DT>list</DT> ஐ <DT>sort</DT> செய்வதற்கு <DT>time</DT> தேவைப்படும். முதலில் <DNT>size n</DNT> இன் இரண்டு <DT>lists</DT> களை 2 ஆல் <DT>sort</DT> செய்ய வேண்டும்.
108
+
109
+ 28
110
+ 00:02:42,370 --> 00:02:50,039
111
+ நாம் <DNT>order n </DNT> ஐ செய்வோம் <DT>merging</DT> ஆக அல்ல. <DT>list</DT> ஐ <DT>decompose</DT> செய்வதற்காக. அதனால் அனைத்து <DT>smaller values</DT> களும் <DT>left</DT> மற்றும் <DNT>right</DNT> இல் இருக்கும்.
112
+
113
+ 29
114
+ 00:02:50,064 --> 00:02:54,483
115
+ நாம் <DT>recursive step</DT> செய்வதற்கு முன் rearranging <DT>step</DT> <DNT>order n</DNT> ஆகும்.
116
+
117
+ 30
118
+ 00:02:54,508 --> 00:02:57,879
119
+ அதேசமயம் <DT>merge</DT> என்பது <DT>recursive step</DT> க்கு பின் வரும் <DT>step</DT> ஆகும்.
120
+
121
+ 31
122
+ 00:02:57,879 --> 00:03:03,879
123
+ இது முந்தைய <DT>case</DT> ல் <DNT>order n</DNT> ஆக இருந்தது. ஆனால் நாம் <DT>recurrence</DT> ஐ <DT>solve</DT>செய்தால் அதே ஒன்றுதான். நமக்கு மற்றொரு <DNT>order n log n algorithm</DNT> கிடைக்கும்.
124
+
125
+ 32
126
+ 00:03:08,730 --> 00:03:12,340
127
+ இந்த <DT>approach</DT> இல் பெரிய <DT>bottleneck</DT> என்னவென்றால் <DT>median</DT> ஐ கண்டறிவதாகும்.
128
+
129
+ 33
130
+ 00:03:13,190 --> 00:03:20,663
131
+ ஒரு <DT>list</DT> ஐ <DT>sorting</DT> செய்வதன் நன்மைகளில் ஒன்று, <DT>sorting</DT> க்கு பின் <DT>median</DT> ஐ middle <DT>element</DT> ஆக நாம் அடையாளம் காணலாம் என்பதை நினைவில் கொள்ளுங்கள்.
132
+
133
+ 34
134
+ 00:03:21,890 --> 00:03:24,336
135
+ இப்போது, இங்கே நாம் <DT>sorting</DT> செய்வதற்கு முன் <DT>median</DT> ஐ கேட்கிறோம்.
136
+
137
+ 35
138
+ 00:03:24,996 --> 00:03:28,539
139
+ ஆனால், நமது நோக்கம் <DT>sort</DT> செய்வது. அது <DT>paradoxical</DT> ஆகும்.
140
+
141
+ 36
142
+ 00:03:28,539 --> 00:03:33,219
143
+ <DT>sorting</DT>ன் <DT>output</DT> <DT>sorting</DT> ஆன <DT>input</DT> ஆக இருக்க வேண்டும் என நாம் விரும்பினால்.
144
+
145
+ 37
146
+ 00:03:34,892 --> 00:03:42,580
147
+ எனவே, <DT>list</DT> ஐ <DNT>split</DNT> செய்து <DT>element</DT> ன் மிகவும் எளிமையான தேர்வு மூலம் <DT>strategy</DT> யை முயற்சிக்க வேண்டும் என்பதே இதன் பொருள்.
148
+
149
+ 38
150
+ 00:03:42,825 --> 00:03:46,780
151
+ <DT>median</DT> ஐ தேடுவதற்குப் பதிலாக, <DNT>list A</DNT> இல் சில <DT>value</DT> ஐ பெறுவோம்.
152
+
153
+ 39
154
+ 00:03:46,780 --> 00:03:49,689
155
+ மற்றும் <DT>pivot element</DT> என அழைக்கப்படுவதைப் பயன்படுத்தவும்.
156
+
157
+ 40
158
+ 00:03:49,689 --> 00:03:56,769
159
+ இந்த <DT>pivot</DT> ஐ பொறுத்து <DNT>A</DNT> என்று பிரிக்கிறோம். இதன���ல் அனைத்து <DT>smaller elements</DT> களும் <DT>left</DT> ஆகவும், <DT>bigger elements</DT> கள் அனைத்தும் <DNT>right</DNT> ஆகவும் இருக்கும்.
160
+
161
+ 41
162
+ 00:04:00,223 --> 00:04:11,636
163
+ இந்த <DT>algorithm</DT> <DT>quick sort</DT> என்று அழைக்கப்படுகிறது. இது 1960 களில் <DT>Tony Four</DT> என்ற நபரால் கண்டுபிடிக்கப்பட்டது மற்றும் இது மிகவும் பிரபலமான <DT>sorting algorithms</DT> களில் ஒன்றாகும்.
164
+
165
+ 42
166
+ 00:04:12,103 --> 00:04:16,082
167
+ பொதுவாக <DT>array</DT> இன் <DT>list</DT> ல் முதல் <DT>element</DT> ஆக இருக்கும் <DT>pivot element</DT> ஐ தேர்வு செய்கிறோம்.
168
+
169
+ 43
170
+ 00:04:16,759 --> 00:04:22,500
171
+ இந்த <DT>pivot</DT> இன் முடிவைப் பொறுத்து <DT>lower part</DT> லும் <DT>upper part</DT> லும் <DNT>partition A</DNT> செய்கிறோம்.
172
+
173
+ 44
174
+ 00:04:22,500 --> 00:04:24,943
175
+ எனவே, அனைத்து <DT>smaller elements</DT> களையும் <DT>left</DT> க்கு நகர்த்துகிறோம்.
176
+
177
+ 45
178
+ 00:04:25,056 --> 00:04:28,149
179
+ மற்றும் அனைத்து <DT> bigger elements</DT> முதல் <DNT>right</DNT> வரை <DT>pivotal</DT> தேர்வைப் பொறுத்து.
180
+
181
+ 46
182
+ 00:04:29,523 --> 00:04:34,163
183
+ இரண்டிற்கும் இடையே <DT>pivot</DT> வருவதை உறுதிசெய்கிறோம். ஏனெனில் <DT>array</DT> ல் முதல் <DT>element</DT> <DT>pivot</DT> ஆக எடுத்துள்ளோம்.
184
+
185
+ 47
186
+ 00:04:34,190 --> 00:04:41,036
187
+ இதற்குப் பிறகு நாம் அதை <DT>lower</DT> மற்றும் <DT>upper bound</DT> க்கு இடையில் உள்ள <DT>center</DT> க்கு நகர்த்த விரும்புகிறோம். பின்னர், இரண்டு <DT>partitions</DT> களை <DT>recursively sort</DT> செய்கிறோம்.
188
+
189
+ 48
190
+ 00:04:44,456 --> 00:04:48,910
191
+ ஒரு பொதுவான <DT>list</DT> ல் <DT>quick sort</DT> எவ்வாறு வேலை செய்யும் என்பது பற்றிய <DT>high level view</DT> இங்கே உள்ளது.
192
+
193
+ 49
194
+ 00:04:48,910 --> 00:04:56,143
195
+ இது தான் நமது <DT>list</DT> என்று வைத்துக்கொள்வோம். <DT>list</DT> ன் தொடக்கத்தை <DT>pivot element</DT> ஆக முதல் <DT>element</DT> ஐ அடையாளம் காண்போம்.
196
+
197
+ 50
198
+ 00:04:56,950 --> 00:05:01,569
199
+ இப்போது, மீதமுள்ள <DT>elements</DT> களில், எந்த <DNT>ones</DNT> <DT>smaller</DT> மற்றும் எந்த <DNT>ones</DNT> <DT>bigger</DT> என்பதைக் கண்டுபிடிக்க வேண்டும்.
200
+
201
+ 51
202
+ 00:05:02,410 --> 00:05:11,510
203
+ இதை எப்படிச் செய்வோம் என்று சொல்லாமல், 32, 22 மற்றும் 13 ஆகிய மூன்று <DT>elements</DT> களை <DT>smaller</DT> ஆகவும் <DNT>yellow</DNT> ல் <DT>marked </DT> செய்யபட்டதாகவும் அடையாளப்படுத்துகிறோம்.
204
+
205
+ 52
206
+ 00:05:11,810 --> 00:05:15,069
207
+ மற்றும் <DNT>green</DNT> இல் <DT>marked </DT> செய்யப்பட்ட மற்ற 4 <DT>elements</DT> கள் பெரியவை.
208
+
209
+ 53
210
+ 00:05:16,160 --> 00:05:20,040
211
+ முதல் <DT>step</DT> உண்மையில் இந்த <DT>criterion</DT> ஐ பொறுத்து <DT>partition</DT> செய்ய வேண்டும்.
212
+
213
+ 54
214
+ 00:05:20,040 --> 00:05:24,810
215
+ நாம் இந்த <DT>elements</DT> களை நகர்த்த வேண்டும். அதனால் அவை இரண்டு <DT>blocks</DT> ஆக வரும்.
216
+
217
+ 55
218
+ 00:05:24,810 --> 00:05:27,550
219
+ அந்த 13, 32 மற்றும் 22 <DT>left</DT> பக்கம் வரும்.
220
+
221
+ 56
222
+ 00:05:27,550 --> 00:05:33,430
223
+ 63 57, 91 மற்றும் 78, <DNT>right</DNT> மற்றும் <DT>pivot element</DT> 43 <DT>middle</DT> ல் வருகிறது.
224
+
225
+ 57
226
+ 00:05:33,947 --> 00:05:36,781
227
+ இது <DT>rearranging step</DT> மற்றும் இப்போது
228
+
229
+ 58
230
+ 00:05:37,060 --> 00:05:41,529
231
+ நாம் <DNT>yellow bits</DNT> மற்றும் <DNT>green bits</DNT> ஆகியவற்றை <DT>recursively sort</DT> செய்வோம். பிறகு அதைச் செய்யலாம் என்று கருதினால்,
232
+
233
+ 59
234
+ 00:05:41,529 --> 00:05:45,480
235
+ ந���்மிடம் ஒரு <DT>sorted array</DT> உள்ளது மற்றும் அனைத்து <DNT>yellow</DNT> பொருட்களும் <DT>smaller than </DT>43 ஆக இருப்பதை கவனிக்கவும்.
236
+
237
+ 60
238
+ 00:05:45,480 --> 00:05:49,509
239
+ மேலும் அனைத்து <DNT>green</DNT> விஷயங்களும் <DT>bigger than</DT> 43. மேலும் <DT>merging</DT> செய்ய தேவையில்லை.
240
+
241
+ 61
242
+ 00:05:52,243 --> 00:05:54,899
243
+ எனவே, <DT>partitioning</DT> எவ்வாறு செயல்படுகிறது என்பதைப் பார்ப்போம்.
244
+
245
+ 62
246
+ 00:05:54,899 --> 00:05:59,350
247
+ இங்கே நம்மிடம் முந்தைய <DT>list</DT> ல் உள்ளது. மேலும் 43 ஐ நமது <DT>pivot element</DT> ஆக <DT>marked </DT> செய்துள்ளோம்.
248
+
249
+ 63
250
+ 00:05:59,350 --> 00:06:03,112
251
+ மீதமுள்ள <DT>elements</DT> களை <DT>scan</DT> செய்து அவற்றை <DT>divide</DT> செய்ய விரும்புகிறோம்.
252
+
253
+ 64
254
+ 00:06:03,137 --> 00:06:08,742
255
+ இரண்டு குழுக்கள், <DT>smaller than</DT> 43, <DNT>yellow ones</DNT>, <DT>bigger than</DT> 43, <DNT>green ones</DNT> மற்றும் அவற்றை <DT>rearrange</DT> செய்யவும்.
256
+
257
+ 65
258
+ 00:06:09,962 --> 00:06:13,839
259
+ நாம் என்ன செய்வோம் இரண்டு <DT>pointers</DT> கள் <DNT>yellow pointer</DNT> மற்றும் <DNT>green pointer</DNT> ஐ வைத்திருப்போம்.
260
+
261
+ 66
262
+ 00:06:14,155 --> 00:06:19,081
263
+ மேலும் பொதுவான விதி என்னவென்றால், எந்த ஒரு <DT>point</DT>லும் நாம் சிறிது <DT>distance</DT> ல் இருப்போம்.
264
+
265
+ 67
266
+ 00:06:19,355 --> 00:06:24,129
267
+ நான் <DNT>orange</DNT> நிறத்தில் வரையப் போகும் <DT>visible</DT> <DNT>yellow pointer</DNT> மற்றும் <DNT>green pointer</DNT>.
268
+
269
+ 68
270
+ 00:06:24,129 --> 00:06:29,165
271
+ இவை இந்த <DT>order</DT> ல் நகரும் <DNT>orange pointer</DNT> அல்லது <DNT>yellow pointer</DNT> எப்போதும் <DNT>green pointer</DNT> பின்னால் இருக்கும்.
272
+
273
+ 69
274
+ 00:06:29,565 --> 00:06:35,397
275
+ நீங்கள் பராமரிக்கும் <DT>inductive property</DT> என்னவென்றால், இந்த <DT>elements</DT> கள் 43 ஐ விட <DT>smaller than</DT> அல்லது சமமாகவோ இருக்கும்.
276
+
277
+ 70
278
+ 00:06:35,910 --> 00:06:40,643
279
+ இந்த <DT>elements</DT> கள் <DT>bigger than</DT> 43 மற்றும் இந்த <DT>elements</DT> கள் <DT>தெரியவில்லை</DT>.
280
+
281
+ 71
282
+ 00:06:42,577 --> 00:06:46,139
283
+ நாம் செய்ய முயற்சிப்பது என்னவென்றால், <DT>left</DT> ல் இருந்து <DNT>right</DNT> க்கு நகர்த்த முயற்சிக்கிறோம்.
284
+
285
+ 72
286
+ 00:06:46,139 --> 00:06:49,589
287
+ ஒவ்வொரு முறையும் <DT>unknown elements</DT> ஐ காணும் அனைத்து <DT>unknown elements</DT> களையும் <DT>classify</DT> செய்யவும்.
288
+
289
+ 73
290
+ 00:06:49,552 --> 00:06:52,660
291
+ இந்த property ஐ நாம் maintain பண்ண இரண்டு <DT>pointers</DT> களை மாற்றுவோம்.
292
+
293
+ 74
294
+ 00:06:52,700 --> 00:06:57,699
295
+ 43 க்கும் முதல் <DT>pointer</DT> க்கும் இடையில் <DT>elements smaller than</DT> 43 அல்லது அதற்கு சமமாக உள்ளன.
296
+
297
+ 75
298
+ 00:06:57,699 --> 00:07:01,494
299
+ முதல் <DT>pointer</DT> க்கும் இரண்டாவது <DT>pointer</DT> க்கும் இடையில் நம் <DT>elements</DT> கள் கண்டிப்பாக 43 க்கு <DT>greater</DT> ஆக உள்ளது.
300
+
301
+ 76
302
+ 00:07:01,752 --> 00:07:05,230
303
+ மற்றும் <DNT>green pointer</DNT> இன் <DNT>right</DNT> பக்கம் இன்னும் <DT>scanned</DT> செய்யப்படாதவை உள்ளன.
304
+
305
+ 77
306
+ 00:07:07,023 --> 00:07:10,000
307
+ எனவே, ஆரம்பத்தில் எதுவும் தெரியவில்லை. பின்னர் நாம் 32 ஐ பார்க்கிறோம்.
308
+
309
+ 78
310
+ 00:07:10,000 --> 00:07:14,618
311
+ 32 43 ஐ விட <DT>smaller than</DT> ஆக இருப்பதால், <DNT>yellow pointer</DNT> ஐ நகர்த்துகிறோம். மேலும் <DNT>green pointer</DNT> ஐ உடன் தள்ளுகிறோம்.
312
+
313
+ 79
314
+ 00:07:14,643 --> 00:07:16,949
315
+ தெரியாத விஷயம் 22 இல் தொடங்குகிறது.
316
+
317
+ 80
318
+ 00:07:16,949 --> 00:07:22,060
319
+ <DNT>yellow</DNT> மற்றும் <DNT>green pointer</DNT> ஆகியவற்றுக்கு இடையே எதுவும் இல்லை. <DT>value bigger than</DT> 43 ஐ நாம் இன்னும் கண்டுபிடிக்கவில்லை.
320
+
321
+ 81
322
+ 00:07:22,949 --> 00:07:24,910
323
+ எனவே, 22 க்கும் அதே நடக்கும்.
324
+
325
+ 82
326
+ 00:07:24,910 --> 00:07:28,629
327
+ இப்போது, 78ஐ பார்க்கும்போது, 78 <DT>bigger than</DT> 43 என்பதைக் கவனிக்கிறோம்.
328
+
329
+ 83
330
+ 00:07:29,008 --> 00:07:33,635
331
+ இப்போது, நாம் <DNT>green pointer</DNT> ஐ மட்டுமே நகர்த்துகிறோம். மேலும் <DNT>yellow pointer</DNT> ஐ அல்ல. இப்போது, இந்த 3 இடைவெளிகளை முன்பு போலவே வைத்திருக்கிறோம்.
332
+
333
+ 84
334
+ 00:07:33,935 --> 00:07:36,819
335
+ இது 43 க்கு குறைவான <DT>equal</DT> ஆன பகுதி என்பதை நினைவில் கொள்ளுங்கள்.
336
+
337
+ 85
338
+ 00:07:36,819 --> 00:07:44,350
339
+ இது <DT>greater than</DT> 43 உள்ள பகுதி மற்றும் இந்த பகுதி unknown <DNT>right</DNT>, நாம் இந்த வழியில் தொடர்கிறோம்.
340
+
341
+ 86
342
+ 00:07:44,350 --> 00:07:48,189
343
+ இப்போது நாம் 63 ஐ பார்க்கிறோம். மீண்டும் 63 <DNT>green zone</DNT> ஐ நீட்டிக்கிறது.
344
+
345
+ 87
346
+ 00:07:48,189 --> 00:07:52,540
347
+ 57 ஒரு <DNT>green zone</DNT> ஐ நீட்டிக்கிறது 91 ஒரு <DNT>green zone</DNT> ஐ நீட்டிக்கிறது.
348
+
349
+ 88
350
+ 00:07:52,540 --> 00:07:56,470
351
+ இப்போது, 13 ஐ கண்டுபிடிக்கும்போது நாம் ஏதாவது செய்ய வேண்டும்.
352
+
353
+ 89
354
+ 00:07:56,470 --> 00:08:00,100
355
+ 13 என்பது இப்போது <DNT>yellow zone</DNT> ல் சேர்க்கப்பட வேண்டிய ஒரு <DT>element</DT>.
356
+
357
+ 90
358
+ 00:08:00,205 --> 00:08:03,705
359
+ ஒரு <DT>strategy</DT> நிறைய மாற்றங்களைச் செய்ய வேண்டும்.
360
+
361
+ 91
362
+ 00:08:03,730 --> 00:08:07,360
363
+ நாம் 13 ஐ 22 இருக்கும் இடத்திற்கு அல்லது 22 க்குப் பிறகு நகர்த்துகிறோம்.
364
+
365
+ 92
366
+ 00:08:07,360 --> 00:08:10,180
367
+ மேலும் 78 இல் இருந்து எல்லாவற்றையும் <DNT>right</DNT> க்கு தள்ளுகிறோம்.
368
+
369
+ 93
370
+ 00:08:10,250 --> 00:08:15,220
371
+ ஆனால் உண்மையில், ஒரு புத்திசாலித்தனமான <DT>strategy</DT> என்னவென்றால், 13 இங்கே செல்ல வேண்டும் என்று சொல்வது.
372
+
373
+ 94
374
+ 00:08:17,605 --> 00:08:21,519
375
+ நாம் space ஐ உருவாக்க வேண்டும். ஆனால் <DT>space</DT> ஐ உருவாக்குவதற்கு பதிலாக.
376
+
377
+ 95
378
+ 00:08:21,519 --> 00:08:30,399
379
+ எப்படியும் <DNT>green</DNT> விஷயங்களை நாம் <DT>sort</DT> செய்யபோகிறோம். அது ஒரு பொருட்டல்ல என்று சொல்லலாம். இரண்டையும் எந்த வழியில் <DT>sort</DT> செய்கிறோம் என்பது எப்படி முக்கியம். இந்த 78ஐ எடுத்து 13க்கு நகர்த்துவோம்.
380
+
381
+ 96
382
+ 00:08:30,399 --> 00:08:33,009
383
+ எந்த மாற்றத்தையும் செய்வதற்கு பதிலாக.
384
+
385
+ 97
386
+ 00:08:33,009 --> 00:08:36,370
387
+ <DNT>green</DNT> zone ல் முதல் <DT>element</DT> ஐ <DT>exchange</DT> செய்கிறோம்.
388
+
389
+ 98
390
+ 00:08:36,370 --> 00:08:38,320
391
+ நாம் இதுவரை பார்க்கும் <DT>element</DT> உடன்.
392
+
393
+ 99
394
+ 00:08:38,320 --> 00:08:41,980
395
+ அது தானாகவே <DNT>yellow zone</DNT> மற்றும் <DNT>green zone</DNT> இரண்டையும் சரியாக நீட்டிக்கும்.
396
+
397
+ 100
398
+ 00:08:42,080 --> 00:08:49,299
399
+ நமது அடுத்த <DT>step</DT> 13 <DT>smaller than</DT> 43 என்பதை கண்டறிந்து, அதை 73 உடன் <DT>இடமாற்று</DT> செய்வது.
400
+
401
+ 101
402
+ 00:08:49,399 --> 00:08:54,070
403
+ இப்போது, நம்மிடம் உள்ள <DT>pivot</DT> ன் <DNT>right</DNT> க்கு ஒரு <DT>intermediate stage</DT> ஐ அடைந்துள்ளோம்.
404
+
405
+ 102
406
+ 00:08:54,070 --> 00:08:58,360
407
+ எல்லாவற்றையும் scanned செய்து, அவற்றை <DT>smaller</DT> ஆக வகைப்படுத்தியுள்ளோம்.
408
+
409
+ 103
410
+ 00:08:58,360 --> 00:08:59,889
411
+ மற்றும் <DT>bigger</DT> ஐயும்.
412
+
413
+ 104
414
+ 00:09:00,716 --> 00:09:04,216
415
+ இப்போது, <DNT>yellow</DNT> விஷயங்களை 43க்கு <DT>left</DT> பக்கம் <DT>push</DT> செய்ய வேண்டும்.
416
+
417
+ 105
418
+ 00:09:05,036 --> 00:09:09,165
419
+ இப்போது, <DNT>yellow zone</DNT> ல் 13ஐ சேர்த்தபோது பார்த்த அதே <DT>problem</DT> மீண்டும் ஒருமுறை நமக்கு வந்துள்ளது.
420
+
421
+ 106
422
+ 00:09:09,190 --> 00:09:13,210
423
+ நாம் 43 ஐ சரியான இடத்திற்கு நகர்த்தினால், இங்கே அனைத்தையும் <DNT>left</DNT> க்கு நகர்த்த வேண்டும்.
424
+
425
+ 107
426
+ 00:09:13,404 --> 00:09:18,940
427
+ ஆனால், அதற்குப் பதிலாக இந்த 13ஐ <DNT>yellow zone</DNT> ல் கடைசி <DT>element</DT> ஆக எடுத்துக்கொள்ளலாம்.
428
+
429
+ 108
430
+ 00:09:18,940 --> 00:09:22,149
431
+ மற்றும் அதை அங்கே <DT>replace</DT> செய்யவும். 32 மற்றும் 22 ஐ shift செய்ய வேண்டாம்.
432
+
433
+ 109
434
+ 00:09:22,149 --> 00:09:26,759
435
+ இது <DT>order</DT> ஐ சீர்குலைக்கிறது. ஆனால் எப்படியும் இது <DT>unsorted</DT> செய்யாமல், <DT>unsorted</DT> ஆக உள்ளது.
436
+
437
+ 110
438
+ 00:09:27,632 --> 00:09:29,889
439
+ நாம் இதை செய்கிறோம். இப்போது நம்மிடம் உள்ளது.
440
+
441
+ 111
442
+ 00:09:30,001 --> 00:09:36,171
443
+ நாம் விரும்பியபடி <DT>array rearranged</DT> செய்யப்பட்டது. எனவே, <DT>left</DT> ல் உள்ள இவை அனைத்தும் <DT>smaller than</DT> <DT>pivot</DT>.
444
+
445
+ 112
446
+ 00:09:37,244 --> 00:09:41,856
447
+ <DT>pivot</DT> நடுவில் உள்ளது. மற்றும் <DNT>right</DNT> ல் உள்ள அனைத்தும் <DT>bigger than</DT> <DT>pivot</DT>.
448
+
449
+ 113
450
+ 00:09:46,550 --> 00:09:53,830
451
+ இங்கே <DT>python</DT> இன் ஒரு <DT>implementation</DT> உள்ளது. <DT>quick sort</DT> என்பது <DT>merge sort </DT> மற்றும் <DT>binary research</DT> போன்றவற்றைக் கொண்டிருக்கும் என்பதை நினைவில் கொள்ளவும்.
452
+
453
+ 114
454
+ 00:09:53,830 --> 00:09:58,690
455
+ <DT>smaller</DT> மற்றும் <DT>smaller segments</DT> ல் அதை மீண்டும் மீண்டும் பயன்படுத்துகிறோம். பொதுவாக நாம் அதை <DT>pass</DT> செய்யவும்.
456
+
457
+ 115
458
+ 00:09:58,690 --> 00:10:03,523
459
+ நாம் <DNT>call A</DNT> என்ற <DT>list</DT> க்கும், <DT>segment</DT> ன் <DT>end points</DT> ஆன <DNT>left</DNT> மற்றும் <DNT>right</DNT>.
460
+
461
+ 116
462
+ 00:10:03,548 --> 00:10:07,238
463
+ நாம் ஒரு <DNT>slice l </DNT> முதல் <DNT>r minus 1</DNT> வரை செய்கிறோம்.
464
+
465
+ 117
466
+ 00:10:08,244 --> 00:10:13,210
467
+ இந்த <DT>slice</DT> 1 அல்லது 0 <DT>length</DT> ஆக இருந்தால், நாம் எதுவும் செய்ய மாட்டோம்.
468
+
469
+ 118
470
+ 00:10:14,223 --> 00:10:17,320
471
+ இல்லையெனில், நாம் முன்பு இருந்த இந்த <DT>partitioning strategy</DT> ஐ பின்பற்றுவோம்.
472
+
473
+ 119
474
+ 00:10:17,708 --> 00:10:22,120
475
+ அதாவது <DNT>l</DNT> இலிருந்து <DNT>r minus 1</DNT> வரை <DT>sorting</DT> செய்கிறோம்.
476
+
477
+ 120
478
+ 00:10:22,120 --> 00:10:24,220
479
+ எனவே, <DT>position l</DT>.
480
+
481
+ 121
482
+ 00:10:24,379 --> 00:10:25,899
483
+ இது <DT>pivot</DT> ஆகும்.
484
+
485
+ 122
486
+ 00:10:26,793 --> 00:10:29,671
487
+ <DNT>right</DNT> முதலில் இங்கே <DNT>yellow pointer</DNT> ஐ வைப்போம்.
488
+
489
+ 123
490
+ 00:10:31,011 --> 00:10:33,635
491
+ <DNT>yellow zone</DNT> இன் முடிவு என்று கூறுகிறது.
492
+
493
+ 124
494
+ 00:10:34,005 --> 00:10:38,500
495
+ உண்மையில் <DT>pivot</DT> உள்ளது அங்கு எதுவும் இல்லை. <DNT>yellow</DNT> என்பது <DNT>l plus 1</DNT> ஆகும்.
496
+
497
+ 125
498
+ 00:10:38,500 --> 00:10:50,781
499
+ இப்போது <DNT>green</DNT>ஐ தொடர அனுமதிக்கிறோம். ஒவ்வொரு <DT>time</DT>ம் <DNT>green</DNT> இல் ஒரு <DT>element</DT> ஐ பார்க்கும்போது புதிய <DNT>green</DNT> ஒன்���ைக் காட்டிலும் <DT>smaller than</DT> ஆக இருக்கும் <DT>pivot</DT> ஆகும். இது <DT>pivot</DT> என்பதை நினைவில் கொள்ளுங்கள்.
500
+
501
+ 126
502
+ 00:10:51,965 --> 00:10:55,661
503
+ <DNT>right</DNT> நாம் எப்போதாவது ஒரு <DNT>green</DNT> ஐ பார்த்தால், அடுத்த <DT>value</DT> ஐ.
504
+
505
+ 127
506
+ 00:10:55,686 --> 00:10:57,580
507
+ சரிபார்க்கப்பட வேண்டியதை விட <DT>smaller than</DT> அல்லது சமமானது.
508
+
509
+ 128
510
+ 00:10:57,590 --> 00:11:01,714
511
+ நாம் <DT>exchange</DT> செய்கிறோம். இதனால் இந்த <DT>value</DT> ஐ <DNT>yellow zone</DNT> ன் முடிவுக்குக் கொண்டு வருகிறோம்.
512
+
513
+ 129
514
+ 00:11:01,739 --> 00:11:03,220
515
+ இதைத்தான் 13ல் செய்தோம்.
516
+
517
+ 130
518
+ 00:11:03,344 --> 00:11:07,590
519
+ பின்னர், <DNT>yellow pointer</DNT> ஐ நகர்த்துகிறோம். இல்லையெனில் கண்டிப்பாக <DT>bigger</DT> <DT>value</DT> ஐ கண்டால் நகர்த்துவோம்.
520
+
521
+ 131
522
+ 00:11:07,590 --> 00:11:11,860
523
+ <DNT>green pointer</DNT> மட்டுமே <DT>for loop</DT> ஆல் மறைமுகமாக செய்யப்படுகிறது. மற்றொன்றை நகர்த்த மாட்டோம்.
524
+
525
+ 132
526
+ 00:11:11,929 --> 00:11:14,883
527
+ இதன் முடிவில் நமக்கு <DT>pivot</DT> உள்ளது.
528
+
529
+ 133
530
+ 00:11:15,894 --> 00:11:19,784
531
+ நாம் <DT>pivot</DT> க்கு சமமானதைக் காட்டிலும் குறைவானதைக் கொண்டுள்ளோம். பின்னர் <DT>greater than pivot</DT> ம் கொண்டுள்ளோம்.
532
+
533
+ 134
534
+ 00:11:19,809 --> 00:11:27,914
535
+ இந்த விதியின் முடிவில் நாம் அடைந்த அந்த intermediate stage இதுதான். இப்போது, நாம் <DT>pivot</DT> ஐ கண்டுபிடித்து சரியான இடத்திற்கு நகர்த்த வேண்டும். எனவே, <DNT>yellow</DNT> என்பதை நினைவில் கொள்ளுங்கள்.
536
+
537
+ 135
538
+ 00:11:29,241 --> 00:11:32,769
539
+ <DNT>yellow</DNT> <DNT>last</DNT> க்கு அப்பால் உள்ள <DT>position</DT> ஐ சுட்டிக்காட்டுகிறது.
540
+
541
+ 136
542
+ 00:11:32,769 --> 00:11:37,440
543
+ <DT>element அதை விட சிறியது</DT>. <DNT>yellow</DNT> இதற்கு முன் எப்போதும் ஒரு <DT>value</DT> ஆகும்.
544
+
545
+ 137
546
+ 00:11:37,440 --> 00:11:40,396
547
+ <DNT>yellow</DNT> minus 1 இன் <DT>value</DT> ஐ எடுத்து, <DT>left value</DT> உடன் <DT>exchange</DT> செய்வோம்.
548
+
549
+ 138
550
+ 00:11:41,414 --> 00:11:48,765
551
+ இப்போது நாம் செய்ய வேண்டியது என்னவென்றால், நம்மிடம் இப்போது <DNT> p, p and greater than p</DNT> ஐ விட குறைவாக உள்ளது.
552
+
553
+ 139
554
+ 00:11:49,627 --> 00:12:01,350
555
+ இங்குதான் <DNT>yellow</DNT> <DNT>சரியானது</DNT>. நாம் 0 இலிருந்து <DNT>yellow</DNT> minus 1 க்கு செல்ல வேண்டும். மீண்டும் <DNT>sort p </DNT> ஐ விரும்பவில்லை. ஏனெனில் <DNT>p</DNT> ஏற்கனவே சரியான இடத்தில் வைக்கப்பட்டுள்ளது.
556
+
557
+ 140
558
+ 00:12:01,350 --> 00:12:06,391
559
+ <DNT>L</DNT> இலிருந்து <DNT>yellow</DNT> minus 1 ஆகவும், <DNT>yellow</DNT> இலிருந்து <DNT>right</DNT> முனையிலும் <DT>quick sort</DT> செய்வோம்.
560
+
561
+ 141
562
+ 00:12:13,070 --> 00:12:17,070
563
+ <DT>slide</DT> ல் பார்த்த <DT>python code</DT> ஐ இங்கே ஒரு <DT>file</DT> ல் எழுதியுள்ளோம்.
564
+
565
+ 142
566
+ 00:12:17,070 --> 00:12:20,320
567
+ slide ல் இருந்த அதே <DT>code</DT> இதுதானா என்பதை சரிபார்க்கலாம்.
568
+
569
+ 143
570
+ 00:12:20,345 --> 00:12:28,786
571
+ நாம் அதை முயற்சி செய்து <DT>run</DT> செய்யலாம் மற்றும் அது செயல்படுகிறதா என்று சரிபார்க்கலாம். <DT>call python</DT>, இந்த <DT>function</DT> ஐ <DT>import</DT> செய்கிறோம்.
572
+
573
+ 144
574
+ 00:12:32,849 --> 00:12:37,699
575
+ இது மீண்டும் ஒரு வகையான <DT>sorts</DT> <DT>function</DT> என்பதை நினைவில் கொள்ளுங்கள். எதையாவது <DT>sort</DT> செய்து அதன் விளைவைப் பார்க்க விரும்பினால்.
576
+
577
+ 145
578
+ 00:12:37,753 --> 00:12:40,870
579
+ நாம் அதற்கு ஒரு <DT>name</DT> ஐ <DT>assign</DT> செய்ய வேண்டும். பின்னர் அந்த <DT>name</DT> ஐ <DT>sort</DT> செய்து, பிறகு <DT>name</DT> ஐ சரிபார்க்க வேண்டும்.
580
+
581
+ 146
582
+ 00:12:40,909 --> 00:12:48,137
583
+ எடுத்துக்காட்டாக, 500 முதல் 0 வரையிலான <DT>range</DT> of <DT>values</DT> ஐ எடுத்துக் கொள்வோம்.
584
+
585
+ 147
586
+ 00:12:50,287 --> 00:12:58,090
587
+ இப்போது நாம் <DNT>quicksort l</DNT> என்று சொன்னால், அதற்கு <DNT>of course</DNT> முடிவைக் கொடுக்க வேண்டும்.
588
+
589
+ 148
590
+ 00:13:01,020 --> 00:13:02,468
591
+ பிறகு <DNT>l</DNT> சரியாக <DT>sorted</DT> செய்யப்படும்.
592
+
593
+ 149
594
+ 00:13:04,311 --> 00:13:09,523
595
+ நீங்கள் அனைத்தையும் பார்க்க முடியாது. ஆனால் 83 84 முதல் நூறு வரை மற்றும் இரண்டு 500 வரை பார்க்க முடியும்.
596
+
597
+ 150
598
+ 00:13:10,995 --> 00:13:16,480
599
+ இப்போது, 1000 என்று சொன்னால், <DT>insertion sort</DT> ல் நமக்கு இருந்த அதே <DT>problem</DT> உள்ளது.
600
+
601
+ 151
602
+ 00:13:17,897 --> 00:13:22,596
603
+ பின்னர் நாம் இதை <DT>quicksort</DT> செய்ய முயற்சிக்கிறோம். நீங்கள் இதை <DT>recursion depth</DT> ஆல் பெறுவீர்கள்.
604
+
605
+ 152
606
+ 00:13:22,621 --> 00:13:29,644
607
+ <DT>worst case</DT> ல் நாம் பார்ப்பது போல, <DT>quick sort</DT> ஆனது <DT>insertion sort</DT> ஐ போலவே செயல்படுகிறது மற்றும் இது மோசமான case.
608
+
609
+ 153
610
+ 00:13:29,669 --> 00:13:33,759
611
+ இதைப் போக்க, நாம் வழக்கமான காரியத்தைச் செய்ய வேண்டும். <DT>SYS module</DT> ஐ <DT>import</DT> செய்ய வேண்டும்.
612
+
613
+ 154
614
+ 00:13:33,759 --> 00:13:35,409
615
+ <DT>recursion limit</DT> ஐ <DT>set</DT> செய்யவும்.
616
+
617
+ 155
618
+ 00:13:36,658 --> 00:13:43,652
619
+ எனவே, பொருத்தமான பெரிய ஒன்று பத்தாயிரம் அல்லது நூறாயிரம் என்று சொல்லுங்கள். பின்னர் அதை <DT>quicksort</DT> செய்ய சொன்னால் எந்த problem உம் இல்லை.
620
+
621
+ 156
622
+ 00:13:44,779 --> 00:13:49,299
623
+ <DT>python</DT> ல் இந்த <DT>recursion limit</DT> ஐ manually set செய்ய வேண்டிய மற்றொரு case இதுவாகும்.
624
+
625
+ 157
626
+ 00:13:49,647 --> 00:13:56,929
627
+ உண்மையில் நாம் பார்க்கக்கூடிய ஒரு விஷயம் என்னவென்றால், <DT>quicksort</DT> என்பது நாம் நம்புவது போல் நல்லதல்ல, ஏனெனில்.
628
+
629
+ 158
630
+ 00:13:57,008 --> 00:14:02,080
631
+ எடுத்துக்காட்டாக, 7500 என்று ஏதாவது <DT>size</DT> ஐ <DT>instance sort</DT> செய்யவும்.
632
+
633
+ 159
634
+ 00:14:05,504 --> 00:14:09,554
635
+ பின்னர் அது ஒரு புலப்படும் நேரம் எடுக்கும். எனவே, <DNT>n log n</DNT> என்று <DT>merge sort </DT> ஐ பார்த்தோம்.
636
+
637
+ 160
638
+ 00:14:09,790 --> 00:14:13,700
639
+ 5,000 மற்றும் 10000 மற்றும் 100,000 கூட <DT>instantaneously</DT> செய்யும்.
640
+
641
+ 161
642
+ 00:14:13,832 --> 00:14:18,129
643
+ தெளிவாக <DT>quick sort</DT> மற்றும் <DT>merge sort </DT> செயல்படாது.
644
+
645
+ 162
646
+ 00:14:18,165 --> 00:14:22,480
647
+ மற்றும் உண்மையில் <DT>quick sort</DT> க்கு <DT>order</DT> <DNT>n log n</DNT> <DT>merge sort </DT> இல்லை என்பதை நாம் பார்ப்போம்.
648
+
649
+ 163
650
+ 00:14:22,511 --> 00:14:25,090
651
+ நாம் விரும்பியபடி நடத்தை.
652
+
653
+ 164
654
+ 00:14:25,090 --> 00:14:28,539
655
+ அதற்குக் காரணம், நாம் <DT>median</DT> ஐ பயன்படுத்தாமல், split செய்வதற்கான முதல் <DT>value</DT> ஐ பயன்படுத்துகிறோம்.
656
+
657
+ 165
658
+ 00:14:28,539 --> 00:14:33,909
659
+ அதை அடுத்த lecture ல் பார்ப்போம். ஏன் <DT>quick sort</DT> ல் உண்மையி���் ஒரு worst case <DNT>order n log n algorithm</DNT> அல்ல.
660
+
lip_sync_online_v1_original.py ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Lip syncing code - Online version
3
+ """
4
+
5
+ import os
6
+ import sys
7
+ import moviepy.editor as mp
8
+ from pysrt import SubRipFile, SubRipTime, SubRipItem
9
+ import argparse
10
+
11
+
12
+ def srt_time_to_seconds(time_datetime_format):
13
+ time_iso_format = time_datetime_format.isoformat()
14
+ # print(time_iso_format)
15
+ seconds = float(time_iso_format.split(':')[-1])
16
+ rest_list = time_iso_format.split(':')[:-1]
17
+ # print(rest_list)
18
+ if ":".join(rest_list) == "00:00":
19
+ pass
20
+ else:
21
+ for i in range(0,len(rest_list)):
22
+ if i == 0:
23
+ # print(rest_list[i])
24
+ seconds += int(rest_list[i])*3600
25
+ elif i == 1:
26
+ # print(rest_list[i])
27
+ seconds += int(rest_list[i])*60
28
+ else:
29
+ sys.exit("Error in time conversion")
30
+ return seconds
31
+
32
+ def lip_sync(video_path, srt_path, audio_list, output_video, output_srt):
33
+
34
+ # output video filename without extension
35
+ output_filename = os.path.splitext(output_video)[0]
36
+
37
+ # read the original video as obj
38
+ video_obj = mp.VideoFileClip(video_path)
39
+
40
+ # read target srt file
41
+ srt = SubRipFile.open(srt_path)
42
+
43
+ # initialize variables
44
+ video_clips = []
45
+
46
+ prev_end_time = SubRipTime(0)
47
+
48
+ new_srt_start_time = []
49
+ new_srt_end_time = []
50
+ new_srt_total_duration = 0.0
51
+
52
+ # iterate through srt entries
53
+ for i, srt_entry in enumerate(srt):
54
+
55
+ print(f"srt_num: {i+1}")
56
+
57
+ start_time = srt_entry.start.to_time()
58
+ end_time = srt_entry.end.to_time()
59
+
60
+ if srt_time_to_seconds(start_time) > srt_time_to_seconds(prev_end_time.to_time()):
61
+ # add inter-srt clip to video_clips
62
+ inter_srt_clip = video_obj.subclip(srt_time_to_seconds(prev_end_time.to_time()), srt_time_to_seconds(start_time))
63
+ inter_srt_clip_without_audio = inter_srt_clip.without_audio()
64
+ # Create a silent audio clip with the same duration as the video
65
+ silence = mp.afx.audio_loop(mp.AudioFileClip("silence.wav"), duration=(srt_time_to_seconds(start_time) - srt_time_to_seconds(prev_end_time.to_time())), nloops=1)
66
+ # Set the silent audio track in the video clip
67
+ inter_srt_clip_with_silence = inter_srt_clip_without_audio.set_audio(silence)
68
+ video_clips.append(inter_srt_clip_with_silence)
69
+
70
+ new_srt_total_duration += inter_srt_clip_with_silence.duration
71
+
72
+ srt_clip = video_obj.subclip(srt_time_to_seconds(start_time), srt_time_to_seconds(end_time))
73
+ srt_clip_without_audio = srt_clip.without_audio()
74
+ video_clips.append(srt_clip_without_audio)
75
+
76
+ # read audio file
77
+ audio_clip = mp.AudioFileClip(audio_list[i])
78
+
79
+ # interpolate video to match audio duration
80
+ if srt_clip.duration != audio_clip.duration:
81
+
82
+ srt_clip = srt_clip.fx(mp.vfx.speedx, factor=srt_clip.duration/audio_clip.duration)
83
+
84
+ srt_clip_without_audio = srt_clip.without_audio()
85
+
86
+ # replace audio in video clip
87
+ video_clip = srt_clip.set_audio(audio_clip)
88
+
89
+ new_srt_start_time.append(new_srt_total_duration)
90
+ new_srt_end_time.append(new_srt_total_duration+video_clip.duration)
91
+
92
+ new_srt_total_duration += video_clip.duration
93
+
94
+ # add video clip to list
95
+ video_clips[-1] = video_clip
96
+
97
+ # update previous end time
98
+ prev_end_time = srt_entry.end
99
+
100
+
101
+ # check if last srt ends before video ends and add final clip if necessary
102
+ last_srt_end_time = srt[-1].end.to_time()
103
+ video_duration = video_obj.duration
104
+
105
+ print("Completed for loop")
106
+ try:
107
+ if last_srt_end_time != video_duration:
108
+ final_clip = video_obj.subclip(srt_time_to_seconds(last_srt_end_time), video_duration)
109
+ final_clip_without_audio = final_clip.without_audio()
110
+ # Create a silent audio clip with the same duration as the video
111
+ silence = mp.afx.audio_loop(mp.AudioFileClip("silence.wav"), duration=(video_duration - srt_time_to_seconds(last_srt_end_time)), nloops=1)
112
+ final_clip_with_silence = final_clip_without_audio.set_audio(silence)
113
+ video_clips.append(final_clip_with_silence)
114
+ # video_clips.append(final_clip_without_audio)
115
+ except:
116
+ print("Except")
117
+
118
+ print("try , except completed here. check here error is there or not")
119
+ # concatenate video clips and write final video
120
+ final_video = mp.concatenate_videoclips(video_clips)
121
+ # final_video.write_videofile("output_video.mp4", threads=30)
122
+ final_video.write_videofile(output_video, codec="libx264", threads=30, audio_codec='aac', temp_audiofile=output_filename+'.m4a', remove_temp=True, preset="medium", ffmpeg_params=["-profile:v","baseline", "-level","3.0","-pix_fmt", "yuv420p"])
123
+
124
+ # create new srt file with updated timings
125
+ new_srt = SubRipFile()
126
+ for i, srt_entry in enumerate(srt):
127
+ new_start_time = SubRipTime(seconds=new_srt_start_time[i])
128
+ new_end_time = SubRipTime(seconds=new_srt_end_time[i])
129
+ new_srt.append(SubRipItem(index=i+1, start=new_start_time, end=new_end_time, text=srt_entry.text))
130
+
131
+ # Write the updated srt file to file
132
+ new_srt.save(output_srt, encoding='utf-8')
133
+
134
+ def parse_arguments():
135
+ parser = argparse.ArgumentParser(description="Lip syncing script with command-line arguments.")
136
+ parser.add_argument("--original_video_path", required=True, help="Path to the original video file.")
137
+ parser.add_argument("--Translated_SRT", required=True, help="Path to the translated SRT file.")
138
+ parser.add_argument("--audio_dir", required=True, help="Path to the directory containing TTS audio files.")
139
+ parser.add_argument("--output_video_path", required=True, help="Path for the output video file.")
140
+ parser.add_argument("--new_srt_path", required=True, help="Path for the output SRT file.")
141
+
142
+ return parser.parse_args()
143
+
144
+ if __name__ == "__main__":
145
+ args = parse_arguments()
146
+
147
+ video_path = args.original_video_path
148
+ srt_path = args.Translated_SRT
149
+ audio_dir = args.audio_dir
150
+ output_video = args.output_video_path
151
+ output_srt = args.new_srt_path
152
+
153
+ audio_list = os.listdir(audio_dir)
154
+ audio_list.sort()
155
+ audio_list = [os.path.join(audio_dir, file) for file in audio_list]
156
+
157
+ lip_sync(video_path, srt_path, audio_list, output_video, output_srt)
lip_sync_online_v1_silence_remove.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Lip syncing code - Online version
3
+ """
4
+
5
+ import os
6
+ import sys
7
+ import moviepy.editor as mp
8
+ from pysrt import SubRipFile, SubRipTime, SubRipItem
9
+ import argparse
10
+
11
+
12
+ def srt_time_to_seconds(time_datetime_format):
13
+ time_iso_format = time_datetime_format.isoformat()
14
+ # print(time_iso_format)
15
+ seconds = float(time_iso_format.split(':')[-1])
16
+ rest_list = time_iso_format.split(':')[:-1]
17
+ # print(rest_list)
18
+ if ":".join(rest_list) == "00:00":
19
+ pass
20
+ else:
21
+ for i in range(0,len(rest_list)):
22
+ if i == 0:
23
+ # print(rest_list[i])
24
+ seconds += int(rest_list[i])*3600
25
+ elif i == 1:
26
+ # print(rest_list[i])
27
+ seconds += int(rest_list[i])*60
28
+ else:
29
+ sys.exit("Error in time conversion")
30
+ return seconds
31
+
32
+ def lip_sync(video_path, srt_path, audio_list, output_video, output_srt):
33
+ print("length of audui list:", len(audio_list))
34
+ # output video filename without extension
35
+ output_filename = os.path.splitext(output_video)[0]
36
+
37
+ # read the original video as obj
38
+ video_obj = mp.VideoFileClip(video_path)
39
+
40
+ # read target srt file
41
+ srt = SubRipFile.open(srt_path)
42
+
43
+ # initialize variables
44
+ video_clips = []
45
+
46
+ prev_end_time = SubRipTime(0)
47
+
48
+ new_srt_start_time = []
49
+ new_srt_end_time = []
50
+ new_srt_total_duration = 0.0
51
+ sil_total_dur = 0
52
+ sil_total_dur_effective = 0
53
+ aud_total_dur = 0
54
+
55
+ # iterate through srt entries
56
+ for i, srt_entry in enumerate(srt):
57
+
58
+ print(f"srt_num: {i+1}")
59
+
60
+ start_time = srt_entry.start.to_time()
61
+ end_time = srt_entry.end.to_time()
62
+
63
+ if srt_time_to_seconds(start_time) > srt_time_to_seconds(prev_end_time.to_time()):
64
+
65
+ # Create a silent audio clip with the same duration as the video
66
+ sil_dur = srt_time_to_seconds(start_time) - srt_time_to_seconds(prev_end_time.to_time())
67
+ sil_total_dur += sil_dur
68
+ sil_dur = sil_dur * 0.9194003385185787
69
+ sil_total_dur_effective += sil_dur
70
+
71
+ silence = mp.afx.audio_loop(mp.AudioFileClip("silence.wav"), duration=(sil_dur), nloops=1)
72
+ # Set the silent audio track in the video clip
73
+
74
+ # add inter-srt clip to video_clips
75
+ inter_srt_clip = video_obj.subclip(srt_time_to_seconds(prev_end_time.to_time()), srt_time_to_seconds(start_time))
76
+ inter_srt_clip = inter_srt_clip.fx(mp.vfx.speedx, factor=inter_srt_clip.duration/sil_dur)
77
+ inter_srt_clip_without_audio = inter_srt_clip.without_audio()
78
+
79
+ inter_srt_clip_with_silence = inter_srt_clip_without_audio.set_audio(silence)
80
+ video_clips.append(inter_srt_clip_with_silence)
81
+
82
+ new_srt_total_duration += inter_srt_clip_with_silence.duration
83
+
84
+ srt_clip = video_obj.subclip(srt_time_to_seconds(start_time), srt_time_to_seconds(end_time))
85
+ srt_clip_without_audio = srt_clip.without_audio()
86
+ video_clips.append(srt_clip_without_audio)
87
+
88
+ # print("i:",i)
89
+ # read audio file
90
+ audio_clip = mp.AudioFileClip(audio_list[i])
91
+ aud_total_dur+=audio_clip.duration
92
+ # interpolate video to match audio duration
93
+ if srt_clip.duration != audio_clip.duration:
94
+
95
+ srt_clip = srt_clip.fx(mp.vfx.speedx, factor=srt_clip.duration/audio_clip.duration)
96
+
97
+ srt_clip_without_audio = srt_clip.without_audio()
98
+
99
+ # replace audio in video clip
100
+ video_clip = srt_clip.set_audio(audio_clip)
101
+
102
+ new_srt_start_time.append(new_srt_total_duration)
103
+ new_srt_end_time.append(new_srt_total_duration+video_clip.duration)
104
+
105
+ new_srt_total_duration += video_clip.duration
106
+
107
+ # add video clip to list
108
+ video_clips[-1] = video_clip
109
+
110
+ # update previous end time
111
+ prev_end_time = srt_entry.end
112
+
113
+ print("silence total duration",sil_total_dur)
114
+ print("silence total duration effective",sil_total_dur_effective)
115
+ print("new_srt_total_duration",new_srt_total_duration)
116
+ print("aud_total_dur",aud_total_dur)
117
+
118
+ # check if last srt ends before video ends and add final clip if necessary
119
+ last_srt_end_time = srt[-1].end.to_time()
120
+ video_duration = video_obj.duration
121
+ print("Completed for loop")
122
+
123
+ try:
124
+ if last_srt_end_time != video_duration:
125
+ final_clip = video_obj.subclip(srt_time_to_seconds(last_srt_end_time), video_duration)
126
+ final_clip_without_audio = final_clip.without_audio()
127
+ # Create a silent audio clip with the same duration as the video
128
+ silence = mp.afx.audio_loop(mp.AudioFileClip("silence.wav"), duration=(video_duration - srt_time_to_seconds(last_srt_end_time)), nloops=1)
129
+ final_clip_with_silence = final_clip_without_audio.set_audio(silence)
130
+ video_clips.append(final_clip_with_silence)
131
+ # video_clips.append(final_clip_without_audio)
132
+ except:
133
+ print("Except")
134
+ print("try , except function completed here")
135
+ # concatenate video clips and write final video
136
+ final_video = mp.concatenate_videoclips(video_clips)
137
+ # final_video.write_videofile("output_video.mp4", threads=30)
138
+ final_video.write_videofile(output_video, codec="libx264", threads=30, audio_codec='aac', temp_audiofile=output_filename+'.m4a', remove_temp=True, preset="medium", ffmpeg_params=["-profile:v","baseline", "-level","3.0","-pix_fmt", "yuv420p"])
139
+
140
+ # create new srt file with updated timings
141
+ new_srt = SubRipFile()
142
+ for i, srt_entry in enumerate(srt):
143
+ new_start_time = SubRipTime(seconds=new_srt_start_time[i])
144
+ new_end_time = SubRipTime(seconds=new_srt_end_time[i])
145
+ new_srt.append(SubRipItem(index=i+1, start=new_start_time, end=new_end_time, text=srt_entry.text))
146
+
147
+ # Write the updated srt file to file
148
+ new_srt.save(output_srt, encoding='utf-8')
149
+
150
+ def parse_arguments():
151
+ parser = argparse.ArgumentParser(description="Lip syncing script with command-line arguments.")
152
+ parser.add_argument("--original_video_path", required=True, help="Path to the original video file.")
153
+ parser.add_argument("--Translated_SRT", required=True, help="Path to the translated SRT file.")
154
+ parser.add_argument("--audio_dir", required=True, help="Path to the directory containing TTS audio files.")
155
+ parser.add_argument("--new_video", required=True, help="Path for the output video file.")
156
+ parser.add_argument("--new_srt", required=True, help="Path for the output SRT file.")
157
+
158
+ return parser.parse_args()
159
+
160
+ if __name__ == "__main__":
161
+ args = parse_arguments()
162
+
163
+ video_path = args.original_video_path
164
+ srt_path = args.Translated_SRT
165
+ audio_dir = args.audio_dir
166
+ output_video = args.new_video
167
+ output_srt = args.new_srt
168
+
169
+ audio_list = os.listdir(audio_dir)
170
+ audio_list.sort()
171
+ audio_list = [os.path.join(audio_dir, file) for file in audio_list]
172
+ print("srt_path:", srt_path)
173
+ lip_sync(video_path, srt_path, audio_list, output_video, output_srt)
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ moviepy==1.0.3
2
+ pysrt==1.1.2
3
+ Requests==2.31.0
4
+ webvtt_py==0.4.6
run_script.sh ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Get the directory of the Bash script
4
+ script_dir="$(dirname "$(realpath "$0")")"
5
+
6
+ # Set the path to your virtual environment
7
+ # virtual_env_path="../envs/cnn_envs/bin/activate"
8
+
9
+ # Set your paths and language here (relative to the script's location)
10
+
11
+ # Target language {'hin':'hindi','mal':'malayalam','kan':'kannada','bn':'bengali','ur':'urdu','tel':'telugu','pun':'punjabi', 'mar':'marathi', 'guj':'gujarati', 'tam':'tamil', 'hin':'hindi','en':'english'}
12
+
13
+ target_lang="tam"
14
+
15
+ # Original video path
16
+ original_video_path="$script_dir/OrigVideo/Week4_Lecture3.mp4"
17
+
18
+ # Translated SRT path
19
+ translated_srt_path="$script_dir/Translated_SRT/Week4_Lecture3_Cleaned_Tagged.ta.srt"
20
+
21
+
22
+ output_audio_segments_path="$script_dir/TTS_AUDIO"
23
+ final_output_file_path="$script_dir/final_output_vedios"
24
+
25
+ srt_folderpath="$script_dir/Translated_SRT"
26
+
27
+ # Activate the virtual environment
28
+ # source "$virtual_env_path"
29
+
30
+
31
+ # Extract the original video filename without extension
32
+ original_video_name=$(basename "$original_video_path" .mp4)
33
+ srt_file_name=$(basename "$translated_srt_path" .srt)
34
+ # Automatically create new video and SRT file paths based on the original video name
35
+ new_video="$script_dir/$original_video_name.mp4"
36
+ new_srt="$script_dir/$original_video_name.srt"
37
+
38
+ # Create a folder for each target language if it doesn't exist
39
+ output_folder="$final_output_file_path/$target_lang"
40
+ if [ ! -d "$output_folder" ]; then
41
+ mkdir -p "$output_folder"
42
+ fi
43
+
44
+ #echo "location1"
45
+ # Call the Python script for SRT to audio conversion
46
+ python3 "$script_dir/srt_to_audio_original.py" --target_lang "$target_lang" --output_audiopath "$output_audio_segments_path" --srt_folderpath "$srt_folderpath"
47
+
48
+ # TTS audio directory
49
+ audio_dir="$output_audio_segments_path/${target_lang}_WAV/$srt_file_name"
50
+
51
+ echo "audio_dir"
52
+
53
+ #echo "location2"
54
+ # Call the Python lip syncing script with the provided arguments
55
+ python3 "$script_dir/lip_sync_online_v1_original.py" --original_video_path "$original_video_path" --Translated_SRT "$translated_srt_path" --audio_dir "$audio_dir" --output_video_path "$new_video" --new_srt_path "$new_srt"
56
+
57
+ #echo "location3"
58
+ # Run ffmpeg command to convert SRT to ASS to add Subtitle to New Video
59
+ ffmpeg -i "$new_srt" -vf "ass=fontsize=12" "$script_dir/$original_video_name.ass"
60
+
61
+ ffmpeg -i "$new_video" -vf "ass=$script_dir/$original_video_name.ass" "$output_folder/$original_video_name"_with_subtitle.mp4
62
+
63
+ # Remove temporary files
64
+ rm "$new_srt" "$new_video" "$script_dir/$original_video_name.ass"
silence.wav ADDED
Binary file (8.9 kB). View file
 
srt_to_audio_original.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+ Machine Translation to Lipsync
3
+ Created by: Abdullah Mazhar
4
+ Date: 20/02/2023
5
+ '''
6
+
7
+ import os
8
+ import requests
9
+ import json
10
+ import argparse
11
+ from text_to_vtt import SrtToWebVttConverter
12
+ from vtt_to_speech import TextToSpeechAPI
13
+ import shutil
14
+
15
+ class Translator:
16
+ def __init__(self, target_lang, output_audiopath, srt_folderpath):
17
+ self.tts_url = "http://127.0.0.0:3001/vtt_to_speech" #your TTS API URL
18
+ self.output_audiopath = output_audiopath
19
+ self.srt_folderpath = srt_folderpath
20
+ self.target_lang = target_lang
21
+
22
+ ##This is the main function that is calling other functionslike (MT, TXT to SRT, SRT to VTT and VTT to Audio)
23
+ def main(self):
24
+ for srt_file in os.listdir(self.srt_folderpath):
25
+ if srt_file != ".DS_Store":
26
+ srt_filename = srt_file.split(".srt")[0]
27
+ srt_filepath = os.path.join(self.srt_folderpath,srt_file)
28
+ print(srt_filepath)
29
+ tsv = SrtToWebVttConverter(srt_filename, self.output_audiopath)
30
+ # print('1:',tsv)
31
+ print("srt_filrpath:",srt_filepath)
32
+ vtt_filepath, vtt_folderpath= tsv.convert_srt_to_webvtt(srt_filepath)
33
+ print("vtt_filepath, vtt_folderpath",vtt_filepath, vtt_folderpath)
34
+ try:
35
+ tts = TextToSpeechAPI(self.tts_url, self.output_audiopath, srt_filename, self.target_lang, vtt_filepath)
36
+ tts.text_to_speech()
37
+ except:
38
+ print("tts audio was not generated:", srt_filename)
39
+ # shutil.rmtree(vtt_folderpath)
40
+
41
+ if __name__ == '__main__':
42
+ parser = argparse.ArgumentParser(description='Translate text files using OneMT API')
43
+ parser.add_argument('--target_lang', type=str, required=True, help='Target language of the input files')
44
+ parser.add_argument('--output_audiopath', type=str, required=True, help='Path to the directory containing input text files')
45
+ parser.add_argument('--srt_folderpath', type=str, required=True, help='Path to the directory to take srt files')
46
+ args = parser.parse_args()
47
+ print("srt_2_audio:",args.output_audiopath,args.srt_folderpath)
48
+ translator = Translator(args.target_lang, args.output_audiopath, args.srt_folderpath)
49
+ translator.main()
text_to_vtt.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ from pysrt import SubRipFile, SubRipTime, SubRipItem
3
+ import webvtt
4
+ import os
5
+
6
+ class SrtToWebVttConverter:
7
+
8
+ def __init__(self, srt_filename, input_path):
9
+ self.srt_filename = srt_filename
10
+ self.input_path = input_path
11
+
12
+ def convert_srt_to_webvtt(self, srt_filepath):
13
+ vtt_folderpath = self.input_path + "/VTT"
14
+ if not os.path.exists(vtt_folderpath):
15
+ os.makedirs(vtt_folderpath)
16
+ vtt_filepath = vtt_folderpath + "/" + self.srt_filename.split(".srt")[0] + ".vtt"
17
+ subtitles = webvtt.from_srt(srt_filepath)
18
+ subtitles.save(vtt_filepath)
19
+ return vtt_filepath, vtt_folderpath
20
+
21
+
vtt_to_speech.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import json
3
+ import base64
4
+ import os
5
+
6
+ class TextToSpeechAPI:
7
+ def __init__(self, tts_url, input_path, srt_filename, target_lang, vtt_filepath):
8
+ self.tts_url = tts_url
9
+ self.input_path = input_path
10
+ self.srt_filename = srt_filename
11
+ self.target_lang = target_lang
12
+ self.vtt_filepath= vtt_filepath
13
+ self.lang_dict = {'hin':'hindi','mal':'malayalam','kan':'kannada','bn':'bengali','ur':'urdu','tel':'telugu','pun':'punjabi', 'mar':'marathi', 'guj':'gujarati', 'tam':'tamil', 'hin':'hindi','en':'english'}
14
+
15
+ def text_to_speech(self, alpha=1, gender='male', segmentwise=True):#alpha=0.8333332836627969
16
+
17
+ with open(self.vtt_filepath, "r") as f:
18
+ text = f.read()
19
+ payload = json.dumps({
20
+ "input": text,
21
+ "lang": self.lang_dict[self.target_lang],
22
+ "gender": gender,
23
+ "alpha": alpha,
24
+ "segmentwise": segmentwise
25
+ })
26
+ headers = {
27
+ 'Content-Type': 'application/json'
28
+ }
29
+
30
+ response = requests.request("GET", self.tts_url, headers=headers, data=payload)
31
+ print(response)
32
+ api_output = response.json()
33
+ if api_output["status"]=='success':
34
+ segments = api_output['segments']
35
+ print("length of segments:", len(segments))
36
+ wav_folderpath = self.input_path + "/" + self.target_lang + "_WAV"
37
+ if not os.path.exists(wav_folderpath):
38
+ os.makedirs(wav_folderpath)
39
+ for wave_idx, segment in enumerate(segments):
40
+ file_prefix = self.srt_filename.split(".srt")[0]
41
+ week_folderpath = wav_folderpath + "/" + file_prefix
42
+ if not os.path.exists(week_folderpath):
43
+ os.makedirs(week_folderpath)
44
+ wav_file = open("{}/{}_{:04}.wav".format(week_folderpath,file_prefix,wave_idx+1),'wb')
45
+ decode_string = base64.b64decode(segment)
46
+ wav_file.write(decode_string)
47
+ wav_file.close()
48
+
49
+ print(f'Log: TTS saved to folder: "{wav_folderpath}"')
50
+ else:
51
+ print(api_output['reason'])