Skip to content

Latest commit

 

History

History
373 lines (317 loc) · 46.5 KB

File metadata and controls

373 lines (317 loc) · 46.5 KB

JavaScript ალგორითმები და მონაცემთა სტრუქტურები

🇺🇦 უკრაინას თავს ესხმის რუსეთის არმია. მოკლულია მშვიდობიანი მოსახლეობა. ბომბავენ საცხოვრებელ უბნებს.

🇬🇪 საქართველოს 20% ოკუპირებულია რუსეთის არმიის მიერ.

  • მეტი ინფორმაცია wikipedia

CI codecov repo size

ეს საცავი(რეპოზიტორი) შეიცავს JavaScript-ზე დაფუძნებულ მაგალითებს ალგორითმებისა და მონაცემთა სტრუქტურებზე.

თითოეულ ალგორითმსა და მონაცემთა სტრუქტურას აქვს საკუთარი ცალკე README ფაილი, ახსნა-განმარტებებითა და ბმულებით შემდგომი კითხვისთვის (მათ შორის YouTube ვიდეოების ბმულებით).

წაიკითხეთ სხვა ენებზე: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türkçe, Italiano, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch, Uzbek, עברית, ქართული

მონაცემთა სტრუქტურები

"მონაცემთა სტრუქტურა" არის მონაცემების(ინფორმაციის) ორგანიზებისა და შენახვის კონკრეტული გზა კომპიუტერში, იმგვარად რომ შეიძლებოდეს ეფექტურად წვდომა და მოდიფიცირება. ანუ, "მონაცემთა სტრუქტურა" არის მონაცემების(ინფორმაციის) ერთეულების კოლექცია, მათ შორის კავშირები, და ფუნქციები, ოპერაციები აღნიშნულ მონაცემებზე სამუშაოდ.

გახსოვდეთ, რომ თითოეულ მონაცემს აქვს საკუთარი დადებითი და უარყოფითი მხარეები. მეტი ყურადღება უნდა მიაქციოთ იმას, თუ რატომ ირჩევთ კონკრეტულ მონაცემთა სტრუქტურას, ვიდრე იმას, თუ როგორ განვახორციელოთ(დავაიმპლემენტიროთ) იგი.

- მარტივი, - რთული

ალგორითმები

ალგორითმი არის ცალსახა გზა(წესები) იმისა, თუ როგორ გადავჭრათ კონკრეტული პრობლემა. ეს არის წესების სიმრავლე, რომელიც ზუსტად განსაზღვრავს ოპერაციების თანმიმდევრობას.(მაგალითად საჭმლის მომზადების რეცეპტი შეიძლება ჩაითვალოს როგორც ალგორითმი)

- მარტივი, - რთული

ალგორითმები თემებისს მიხედვით

ალგორითმები პარადიგმების მიხედვით

ალგორითმული პარადიგმა არის გენერიკული მეთოდი ან მიდგომა, რომელიც ეფუძნება ალგორითმების კლასის დიზაინს. ეს არის აბსტრაქცია, რომელიც უფრო მაღალია, ვიდრე ალგორითმის კონცეფცია, ისევე როგორც ალგორითმი არის აბსტრაქცია, რომელიც უფრო მაღალია, ვიდრე კომპიუტერული პროგრამა.

როგორ გამოვიყენოთ ეს პროექტი

ინსტალაცია

npm install

გაუშვით ESLint

შეიძლება გსურდეთ მისი გაშვება კოდის ხარისხის შესამოწმებლად.

npm run lint

ტესტების გაშვება

npm test

კონკრეტული ტესტის გაშვება (სახელით)

npm test -- 'LinkedList'

Troubleshooting

თუ linting ან testing არ მუშაობს, შეეცადეთ წაშალოთ node_modules ფოლდერი და ხელახლა დააინსტალიროთ npm პაკეტები:

rm -rf ./node_modules
npm i

ასევე, დარწმუნდით, რომ იყენებთ სწორ Node ვერსიას (>=16). თუ იყენებთ nvm Node ვერსიის მართვისთვის, შეგიძლიათ გაუშვათ nvm use პროექტის root ფოლდერიდან და სწორი ვერსია აირჩევა ავტომატურად.

Playground

შეგიძლიათ წაეთამაშოთ მონაცემთა სტრუქტურებითა და ალგორითმებით ./src/playground/playground.js ფაილში და დაწეროთ ტესტები ./src/playground/__test__/playground.test.js-ში.

შემდეგ, უბრალოდ, გაუშვით შემდეგი ბრძანება, რათა შეამოწმოთ მუშაობს თუ არა თქვენი Playground, როგორც მოსალოდნელია:

npm test -- 'playground'

სასარგებლო ინფორმაცია

ლიტერატურა

Big O აღნიშვნა

Big O აღნიშვნა გამოიყენება ალგორითმების კლასიფიცირებისთვის, თუ როგორ იზრდება მათი გაშვების დრო ან დაკავებული მეხსიერება, შემავალი მონაცემების ზომის ზრდასთან ერთად. ქვემოთ მოცემულ დიაგრამაზე შეგიძლიათ იპოვოთ ყველაზე გავრცელებული ალგორითმების ზრდის რიგები, რომლებიც მითითებულია Big O აღნიშვნით.

Big O გრაფიკები

წყარო: Big O Cheat Sheet.

ქვემოთ მოცემულია ზოგიერთი ყველაზე გამოყენებული Big O აღნიშვნების სია და მათი შესრულების შედარება შემავალი მონაცემების სხვადასხვა ზომებთან.

Big O აღნიშვნა ტიპი 10 ელემენტისთვის 100 ელემენტისთვის 1000 ელემენტისთვის
O(1) მუდმივი 1 1 1
O(log N) ლოგარითმული 3 6 9
O(N) წრფივი 10 100 1000
O(N log N) n log(n) 30 600 9000
O(N^2) კვადრატული 100 10000 1000000
O(2^N) ექსპონენციალური 1024 1.26e+29 1.07e+301
O(N!) ფაქტორალური 3628800 9.3e+157 4.02e+2567

მონაცემთა სტრუქტურის ოპერაციების სირთულე

მონაცემთა სტრუქტურა წვდომა ძიება ჩასმა წაშლა კომენტარები
მასივი 1 n n n
სტეკი n n 1 1
რიგი n n 1 1
ბმული სია n n 1 n
ჰეშ-ცხრილი - n n n სრულყოფილი ჰეშ ფუნქციის შემთხვევაში ღირებულება იქნება O(1)
ორობითი ძიების ხე n n n n დაბალანსებული ხის შემთხვევაში ღირებულება იქნება O(log(n))
B-ხე log(n) log(n) log(n) log(n)
წითელ-შავი ხე log(n) log(n) log(n) log(n)
AVL ხე log(n) log(n) log(n) log(n)
ბლუმის ფილტრი - 1 1 - ძიებისას შესაძლებელია ყალბი დადებითი შედეგები

მასივის დალაგების ალგორითმების სირთულე

სახელი საუკეთესო საშუალო უარესი მეხსიერება სტაბილური კომენტარები
ბუშტულასებრი დალაგება n n2 n2 1 დიახ
ჩასმის დალაგება n n2 n2 1 დიახ
ამორჩევით დალაგება n2 n2 n2 1 არა
გროვით დალაგება n log(n) n log(n) n log(n) 1 არა
შერწყმითი დალაგება n log(n) n log(n) n log(n) n დიახ
სწრაფი დალაგება n log(n) n log(n) n2 log(n) არა Quicksort ჩვეულებრივ კეთდება in-place O(log(n)) სტეკის სივრცით
შელ დალაგება n log(n) დამოკიდებულია ხარვეზების თანმიმდევრობაზე n (log(n))2 1 არა
დათვლის დალაგება n + r n + r n + r n + r დიახ r - მასივში ყველაზე დიდი რიცხვი
რადიქს დალაგება n * k n * k n * k n + k დიახ k - ყველაზე გრძელი გასაღების სიგრძე

პროექტის მხარდამჭერები

თქვენ შეგიძლიათ მხარდაჭერა გამოუხატოთ ამ პროექტს ❤️️ GitHub ან ❤️️ Patreon-ით.

ადამიანები, რომლებიც მხარს უჭერენ ამ პროექტს ∑ = 1

ავტორი

@trekhleb @IosebKoplatadze

კიდევ რამდენიმე პროექტი და სტატია JavaScript-სა და ალგორითმებზე trekhleb.dev-ზე