Upload 13 files
Browse files- .gitattributes +1 -0
- OrigVideo/Week3_Lecture4.mp4 +3 -0
- README.md +101 -3
- TTS_AUDIO/VTT/Week4_Lecture3_Cleaned_Tagged.ta.vtt +496 -0
- Translated_SRT/Week3_Lecture4_Cleaned_Tagged.ta.srt +659 -0
- Translated_SRT/Week4_Lecture3_Cleaned_Tagged.ta.srt +660 -0
- lip_sync_online_v1_original.py +157 -0
- lip_sync_online_v1_silence_remove.py +173 -0
- requirements.txt +4 -0
- run_script.sh +64 -0
- silence.wav +0 -0
- srt_to_audio_original.py +49 -0
- text_to_vtt.py +21 -0
- vtt_to_speech.py +51 -0
.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 |
-
|
| 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'])
|