Algorithm design & data structure
6.63K subscribers
950 photos
142 videos
175 files
545 links
این کانال برای تمامی علاقه‌مندان به کامپیوتر، مخصوصاً حوزه ساختمان داده‌ها و الگوریتم‌ها، مفید می باشد. آشنایی با ریاضیات مقدماتی، برنامه‌نویسی مقدماتی و پیشرفته و همچنین شی‌گرایی می‌تواند در درک بهتر مفاهیم این درس کمک‌ کند.

👨‍💻Admin👉 @Se_mohamad
Download Telegram
فرض کنید که ماکزیمم – هیپ حاوي اعداد متمایز 1 تا 1023 است. حداکثر چند تا از اعداد بیشتر از 1000 میتواند در پایین ترین سطح درخت قرار گیرند؟
Anonymous Quiz
24%
10
40%
12
21%
13
14%
14
تابع هش (Hash Function) در ساختمان داده، به عنوان یکی از عناصر اصلی استفاده می‌شود. این تابع، ورودی‌های مختلف را به یک مقدار خروجی (معمولاً یک عدد) نگاشت می‌کند. هدف اصلی این تابع، تولید یک مقدار هش یکتا برای هر ورودی است، به طوری که اگر دو ورودی متفاوت باشند، مقدار هش آن‌ها نیز با احتمال بسیار زیاد متفاوت باشد.

توابع هش به طور گسترده در ساختمان داده‌ها مانند جدول هش (Hash Table) استفاده می‌شوند. در جدول هش، مقادیر ورودی (کلیدها) به عنوان ورودی به تابع هش داده می‌شوند و مقادیر خروجی (معمولاً اعداد صحیح) به عنوان شاخص‌ها یا آدرس‌های جایگزین در جدول هش استفاده می‌شوند.

یکی از ویژگی‌های اصلی تابع هش، باید سریع و کارآمد باشد و باید بتواند مقدار هش را برای ورودی‌های مختلف با سرعت بالا محاسبه کند. همچنین، تابع هش باید توزیع یکنواختی داشته باشد، به این معنی که برای ورودی‌های مختلف، مقادیر هش به طور یکنواخت پخش شوند، تا اینکه تمامی اندازه‌های جدول هش برابر احتمالی برای ظاهر شدن داده‌ها باشند.

مثالی از یک تابع هش ساده می‌تواند تابع ماژول گیری باشد که می‌تواند عدد ورودی را بر اساس یک مقدار ثابت مانند اندازه جدول هش به مقدار هش تبدیل کند. به عنوان مثال، اگر اندازه جدول هش را ( n ) در نظر بگیریم، می‌توانیم تابع هش را به صورت زیر تعریف کنیم:

h(x) = n mod x

این تابع هش، عدد ورودی ( x) را به یک عدد بین ۰ تا ( n-1 ) نگاشت می‌کند. این تابع هش به سرعت قابل محاسبه است و توزیع یکنواختی دارد. اما باید توجه داشت که تابع هش‌های ساده مانند تابع ماژول گیری، برای برخی موارد ممکن است به دلیل توزیع ناهمگن داده‌ها، بهینه نباشند. در مواردی مانند این، توابع هش پیچیده‌تری مانند توابع هش کریپتوگرافیکی استفاده می‌شوند.

#الگوریتم
📣👨‍💻 @AlgorithmDesign_DataStructuer
در شکل بالا سرچ درختی را مشاهده میکنید که مبدا S و مقصد آن G نیز می باشد. برای انجام این کار ابتدا گراف را تبدیل به درخت میکنیم ( به صورتی باید تبدیل شود که دوری در آن به وجود نیاید) سپس با جست و جو هایی که در شکل مشاهده میکنید مسیر آن به صورت زیر نیز می باشد :

S -> d - > e -> r -> f -> G
#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
👏1
سومین کوچکترین کلید در یک Heap Min با کلیدهاي متمـایز در درایـه هـایی بـا چـه اندیس هایی میتواند باشد؟(از چپ به راست)
Anonymous Quiz
22%
1,2,3
44%
2,3,4,5,6,7
27%
4,5,6,7
7%
1,2,3,4,5,6,7
👍1
زمان اجرای الگوریتم های معروف
نکاتی که میتوان درمورد زمان اجرای یک الگوریتم بدانیم به صورت زیر می باشد :
1-سرعت الگوریتم ن بر اساس ثانیه بلکه بر مبنای رشد تعداد عملیات اندازه گیری می شود.
2-در واقع , مقصود این است که با افزایش اندازه ی داده های ورودی زمان اجرای یک الگوریتم با چه سرعتی افزایش می یابد.
3-زمان اجرای الگوریتم های با نماد O بزرگ بیان می شود.
4-رشد O(log n) بیشتر از O(n) است , اما با رشد لیست موادی که جست و جو می کنید , سرعت آن بسیار بیشتر می شود.

#الگوریتم

📣👨‍💻 @AlgorithmDesign_DataStructuer
👍1
شبیه کد و مثالی از Expectimax

#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
پیاده سازی رگرسیون خطی (Linear Regression) شامل مراحل زیر هست:

1️⃣تولید داده
2️⃣ساخت نورون یا پیاده‌سازی رابطه
3️⃣محاسبه خروجی نورون براساس داده ورودی و مدل رابطه
4️⃣محاسبه لاس یا اتلاف
5️⃣محاسبه گرادیان ها
6️⃣بروزرسانی وزن های نورون

#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
👌1
یک درخت جستجوي باینري با کلمه "SEARCH "(از چپ بـه راسـت) بـسازید. تعـداد متوسط مقایسه براي پیدا کردن یک کاراکتر در این درخت برابر است با:
Anonymous Quiz
18%
2.83
47%
2.4
18%
2.6
18%
6
محاسبه اتلاف یا loss
درکل توابع اتلاف متنوعی با کارکردهای مختلف در یادگیری ماشین و شبکه عصبی وجود دارد. برای مساله رگرسیون، یکی از پرکاربردترین‌ها تابع اتلاف Mean Square Error (MSE) هست.

طبق رابطه بالا، MSE عبارتند از میانگینِ مربعِ اختلاف بین مقدار هدف یا واقعی (y) و مقدار پیش‌بینی‌شده توسط مدلی مانند رگرسیون خطی (a+bx). رابطه بالا در نامپای به‌صورت زیر پیاده‌سازی می‌شود:
error = (y - y_hat)

loss = (error ** 2).mean()


که در کد بالا y همان y واقعی می باشد و y_hat که از رابطه خطی y=wx+b به دست می آید که اختلاف این دو همان error به دست می آید.

#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
Stack memory :

حافظه پشته برای تخصیص حافظه استاتیک استفاده می شود و از ساختار آخرین ورودی، اولین خروجی (LIFO) پیروی می کند. از نظر دسترسی به داده بسیار سریع است اما از نظر اندازه محدودیت دارد. مهم است بدانید که انواع مقادیر مانند انواع اولیه، bool، int، float، char و ... (بستگی به زبان برنامه نویسی دارد) و ارجاعات به اشیاء اعلام شده در یک متد یا تابع معمولاً در پشته ذخیره می شوند. و هنگامی که متد وجود دارد (ما محدوده را داریم) حافظه اختصاص داده شده برای آن متغیرها به طور خودکار تخصیص داده می شود.
برای مثال :
void StackMemoryExampleMethod()
{
int num = 5; // 'num' is allocated on the stack
}

#الگوریتم

📣👨‍💻 @AlgorithmDesign_DataStructuer
فرض کنید A یک ماتریس m * n خلوت (Sparse ) باشد عناصـر غیرصـفر آن را بـه ترتیب سطري در یک آرایه، 3*t که t تعداد عناصـر غیرصـفر مـاتریس اسـت ذخیـره میکنیم. بهترین تابع زمان عمل ترانهاده گیري برابر است با ...
Anonymous Quiz
24%
t+m
34%
tm
24%
tn
17%
t+n
👍3
لیست پيوندي(Linked List) :
ليست پيوندي بر خلاف آرايه پوياست. به همين دليل درج و حذف در آن ساده تر و سريع تر از آرايه است. اما جستجو و مرت بسازي
ميتوانند در آرايه بسيار سريع تر انجام شوند . هر عنصر در ليست يك طرفه خطي از دو بخش تشكيل شده است كه يكي براي ذخيره مقدار و ديگري براي اشاره به عنصر بعدي ليست است. در ليست يك طرفه خطي نميتوان جستجوي دودويي انجام داد جستجوي خطي در ليست يك طرفه از مرتبه (n(O است .
براي حذف گره با آدرس مشخص از ليست يك طرفه ابتدا بايد ليست را تا يافتن گره قبل از آن پيمايش نمود. بنابراين عمليات حذف يك عنصر دلخواه از ليست يك طرفه خطي از مرتبه (n(O است. در حالي كه درج با فرض دانستن مكان آن از (1)O است .
براي دسترسي به عناصر ليست يك طرفه خطي لازم است آدرس عنصر ابتدايي را داشته باشيم. بنابراين گاهي براي هماهنگي اين عنصر با ديگر عناصر آن را مقدار دهي نمي كنند و در حقيقت اولين عنصر حاوي مقدار بعد از عنصر ابتدايي قرار مي گيرد. در اين حالت به عنصر ابتدايي «سر ليست» گفته مي شود .
آخرين اشاره گر ليست يك طرفه خطي null است. با تعريف ليست حلقوي يك طرفه اين اشاره گر به عنصر اول اشاره مي كند. در چنين ليستي با داشتن آدرس هر گره مي توان به كليه گره ها دسترسي داشت و معمولاً به خاطر ساده نمودن درج در ابتداي ليست آدرس گره انتهايي نگه داري مي شود. ليست حلقوي نيز مي تواند سر ليست داشته باشد .
در ليست پيوندي دو طرفه در هر گره دو اشاره گر وجود دارد كه يكي به گره بعدي و ديگري به گره قبلي در ليست اشاره مي كند. بنابراين با داشتن آدرس يك گره كليه گره ها قابل دستيابي هستند. حذف و درج در اين ليست با ليست يك طرفه تفاوت دارد و از مرتبه (1)O است.
#الگوریتم
📣👨‍💻 @AlgorithmDesign_DataStructuer
توابع قابل استفاده در کتابخانه Pthorch :

import torch
random_tensor = torch.rand(size=(3, 4))
random_tensor, random_tensor.dtype
output:
(tensor([[0.1284, 0.5498, 0.0269, 0.1569],
[0.4350, 0.7384, 0.9168, 0.5741],
[0.1758, 0.3176, 0.9596, 0.4971]]),
torch.float32)

این کد یک تنسور تصادفی به ابعاد (3، 4) ایجاد می‌کند و نوع داده‌ی آن را نمایش می‌دهد. تنسور تصادفی با استفاده از تابع torch.rand ایجاد می‌شود و ابعاد آن با استفاده از پارامتر size=(3, 4) مشخص می‌شود. در نهایت، نوع داده‌ی تنسور نیز با استفاده از ویژگی dtype نمایش داده می‌شود.
random_image_size_tensor = torch.rand(size=(224, 224, 3))
random_image_size_tensor.shape, random_image_size_tensor.ndim
output :
(torch.Size([224, 224, 3]), 3)

این کد یک تنسور تصادفی به ابعاد (224، 224، 3) ایجاد می‌کند که معمولاً برای نمایش تصاویر RGB استفاده می‌شود. در این تنسور، ابعاد اول و دوم به ترتیب ارتفاع و عرض تصویر را نشان می‌دهند و ابعاد سوم تعداد کانال‌های رنگی است (سه کانال برای RGB).
tensor = torch.arange(10, 100, 10)
print(f"Tensor: {tensor}")

print(f"Index where max value occurs: {tensor.argmax()}")
print(f"Index where min value occurs: {tensor.argmin()}")
output :
Tensor: tensor([10, 20, 30, 40, 50, 60, 70, 80, 90])
Index where max value occurs: 8
Index where min value occurs: 0

در این کد، یک تنسور با استفاده از تابع torch.arange ایجاد شده است. این تابع یک تنسور ایجاد می‌کند که شروع آن از start است، تا end به مقدار step افزایش می‌یابد.

در اینجا، با استفاده از torch.arange(10, 100, 10) یک تنسور با مقادیر از 10 تا 90 با گام 10 ایجاد شده است.

سپس با استفاده از argmax() و argmin()، اندیس مقادیر بزرگترین و کوچکترین عناصر تنسور به ترتیب به دست می‌آید و چاپ می‌شود. این اندیس‌ها نشان‌دهندهٔ موقعیت (اندیس) این مقادیر در تنسور هستند.
#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
میخواهیم تغییراتی دریک لیست پیوندياعمال کنیم که عمل افزودن عنصر ابتـداویـا انتهـاي لیست با عملیاتی ازمرتبه (1) O قابل انجام باشد. لیست پیوندي را . . .
Anonymous Quiz
25%
حلقوی میکنیم
28%
دو طرفه میکنیم
40%
حلقوی میکنیم وآخرین عنصر را برای دسترسی به لیست ذخیره میکنیم
7%
معکوس میکنیم
الگوریتم و فلوچارت.pdf
5.4 MB
کتاب الگوریتم و فلوچارت برای دوستانی که تازه با رشته کامپیوتر آشنا شدن

#الگوریتم

📣👨‍💻 @AlgorithmDesign_DataStructuer
This media is not supported in your browser
VIEW IN TELEGRAM
پیاده‌سازی گیت OR با ترسپترون:
برای پیاده‌سازی گیت OR با استفاده از نورون ترسپترون، باید وزن‌ها (weights) و بایاس (bias) را به گونه‌ای تنظیم کنیم که رفتار ترسپترون مشابه گیت OR باشد.

همان طور که در گیف مشاهده میکنید ورودی های نوروون (x1,x2) همان AوB نیز می باشند و وزن هر دو 1.5 و bais نیز -1 نیز می باشد این مقادیر به داخل نورون می روند و عملیات هایی در داخل آن انجام می شود و خروجی y را می دهد که در واقع با آن y-had نیز گفته میشود این کار چندین بار اتفاق می افتد اگر خطا غیر صفر باشد وزن ها آپدیت می شود و بعد از چندین اپوک شبکه یاد میگرید که خطی جدایی پذیر بین آن ها قرار دهد که همان طور که در شکل می بینید 3 مقدار آن مقدار خروجی 1 و یکی 0 شده است شبکه باید یاد بگیرید که خطی بین این دو بیندازد و آن ها را از هم جدا کند.
نکته : از نکاتی که باید در این پست بدونیم اینکه در شبکه عصبی پرسپتورن که همان یک معادله جدا پذیری خطی نیز می باشد مقدار وزن ها یعنی W را میدانیم ولی در شبکه عصبی غیر خطی نیز وزن ها را نمیدانیم.

#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
👍2