Jump to content
IT-პროგრამირების ფორუმი
Sign in to follow this  
samuraisxmali

მარტივი ალგორითმები

Recommended Posts

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

შებრუნებული რიცხვის ალგორითმი (Reversed Number)

კოდს აქვს შემდეგი სახე:

int number = 34567;
int reversed = 0;
while (number > 0)
{
int rem = number % 10;
reversed = (reversed * 10) + rem;
number = number / 10;
}
Console.WriteLine("Reversed Number = {0}", reversed);
Console.ReadKey();
ვთქვათ მოცემული რიცხვია 34567. უნდა მივიღოთ 76543.
მთელი რიცხვის 10-ზე გაყოფით ნაშთის აღების ოპერაცია საშუალებას გვაძლევს მივმართოთ ბოლო ციფრს, ანუ ნაშთს, იგივე ერთეულის ციფრი, ჩვენ შემთხვევაში პირველად ეს იქნება 7. rem = 34567 % 10; და აქედან, ნაშთი არის 7. შემდეგ შებრუნებული რიცხვში ვწერთ, ამ ნაშთს, მაგრამ ყოველ ჯერზე, შებრუნებული რიცხვი ჯერ 10-ჯერ უნდა გაიზარდოს, რომ მივიღოთ რეალურად შებრუნებული რიცხვი, რადგან მანამდე ის 10-ჯერ შემცირდა. სწორედ ამისთვის: reversed = (reversed * 10) + rem; ანუ ვიღებ შებრუნებულ რიცხვს, თავდაპირველად ეს არის 0, ის მრავლდება 10-ზე, რაც ისევ ნულია, შემდეგ მას ემატება ნაშთი (0 + 7) და ამგვარად შებრუნებულ რიცხვში პირველ ციფრად ჩაიწერება 7. ამის შემდეგ საჭიროა, რომ რიცხვს ჩამოცილდეს ნაშთის ციფრი, ეს კი ხორციელდება მოცემული რიცხვის 10-ზე გაყოფით, ვინაიდან საქმე ეხება მთელ რიცხვს და 10-ზე გაყოფა მთლიანად ჩამოაცილებს ერთეულის რიცხვს, ანუ 7-ს და დაგვრჩება 3456. ამის შემდეგ დაიწყება მეორე ციკლი, ორონდ ამჯერად რიცხვის სახით გვექნება 3456. ამ რიცხვზეც შესრულდება იგივე ოპერაციები და შესაბამისად, rem გაუტოლდება 6-ს, reversed გახდება 76-ის ტოლი (7 * 10 + 6 = 70 + 6 = 76), ხოლო რიცხვად დაგვრჩება 345; ეს გაგრძელდება მანამ, სანამ რიცხვი 0-ზე მეტია - while (number > 0). ამ დროისთვის კი რიცხვის ყველა ციფრი შეიცვლის ადგილს შედეგად მივიღებთ რიცხვს 76543. ამ ყველაფრის თვალსაჩინოებისთვის გთავაზობთ სურათსაც:
11mdc8k.jpg
  • Upvote 1

Share this post


Link to post
Share on other sites

ფიშერ-იატის არევის ალგორითმი

class Program
{
//ეს ალგორითმი გამოიყურება ასე:
static Random _random = new Random();
public static void Shuffle<T>(T[] array)
{
var random = _random;
for (int i = array.Length; i > 1; i--)
{
//შემთხვევითი ელემენტის არჩევა.
int j = random.Next(i);
// 0 <= j <= i-1 // ადგილების გაცვლა.
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
}
 
//ესეც მისი გამოყენება
static void Main(string[] args)
{
{
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Shuffle(array);
foreach (int value in array)
{
Console.WriteLine(value);
}
}
 
{
string[] array = { "scripts", "interesting", "ge" };
Shuffle(array);
foreach (string value in array)
{ Console.WriteLine(value);
}
}
Console.ReadKey();
}
}
როგორც ხედავთ, ჯერ იქმნება Random ტიპის ობიექტი, რომელიც შემდეგ გამოიყენება შემთხვევითი რიცხვის ასარჩევად. არჩევის შემდეგ ხდება ადგილების გადანაცვლება და საბოლოოდ ვიღებთ არეულ მასივს. ამ მეთოდით შესაძლებელია ნებისმიერი ტიპის მასივების არევა, მე მაგალითში მოყვანილი მაქვს ორი: რიცხვითი და სტრიქონული ტიპის მასივების არევა.

Share this post


Link to post
Share on other sites

პალინდრომი

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

public static bool IsPalindrome(string value)    {	int min = 0;	int max = value.Length - 1;	while (true)	{	    if (min > max)	    {		return true;	    }	    char a = value[min];	    char b = value[max];	    if (char.ToLower(a) != char.ToLower(B))	    {		return false;	    }	    min++;	    max--;	}    }
მისი გამოყენება კი მაგალითად ასე იქნება:
 static void Main()    {	string[] array =	{	    "civic",	    "deified",	    "deleveled",	    "devoved",	    "dewed",	    "Hannah",	    "kayak",	    "level",	    "madam",	    "racecar",	    "radar",	    "redder",	    "refer",	    "repaper",	    "reviver",	    "rotator",	    "rotor",	    "sagas",	    "solos",	    "sexes",	    "stats",	    "tenet",	    "scripts",	    "interesting",	    "ge",	    "ar",	    "aris",	    "palindromi"	};	foreach (string value in array)	{	    Console.WriteLine("{0} = {1}", value, IsPalindrome(value));	}        Console.ReadKey();    }

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×