moradian
چهارشنبه 03 تیر 1394, 01:29 صبح
سلام بر اساتید محترم
حقیقتش یه الگوریتم می خوام برا یه کار خاصی، خلاصه وار توضیح میدم:
ببینید فرض کنیم آرایه ای بسیار بزرگ از بایت داریم شامل اعداد 0 و 1 مثلا تو یه فایل که در ایندکس های نامشخص ولی پشت سر هم ذخیره شده اند. (در این مثال طول آرایه 2000 بایته) محتوای فایل:
11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111100 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000001111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111100000000000000 00000000000111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000001111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000001111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11000000000000000000000000000000000000000000001111 11111111111111100000000000000000000000000000000000 00000000111111111111111111111111111111111111111111 11111111111111111111111111111111000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000111111111111111111 11111111111111111111111111111111111000000000000111
لطفا این نمونه 0 و 1 ها رو کپی و فاصله ها رو حذف کنید و تو فایل جدیدی با نام bytes.txt تو فولدر Debug پروژه تون بریزید تا خروجی تون با من با اجرای کد یکسان بشه.
حال مساله اینجاست الگوریتمی میخوام که با کمترین تعداد اجرای بدنه حلقه، مثلا تعداد 1 ها را استخراج کند. خودم این کد رو فعلا نوشتم که هر چه بالا پایینش کردم خروجی صحیحی نگرفتم میدونم الگوریتم مزخرفیه!.
byte[] bytes = File.ReadAllBytes(Application.StartupPath + "\\bytes.txt");
int zero = bytes.Where(c => c == 48).Count();
int one = bytes.Where(c => c == 49).Count();
label4.Text = zero.ToString();
label5.Text = one.ToString();
int zCount = 0;
int oCount = 0;
int cloop = 0;
for (int i = 0; i < bytes.Length; i++)
{
cloop++;
bool b = bytes[i] == 49;
if (b)
{
oCount++;
}
else
{
while (!b)
{
if (bytes.Length - i < 10)
{
break;
}
i += 10;
b = bytes[i] == 49;
cloop++;
if (b)
{
i -= 9;
}
}
}
}
label6.Text = oCount.ToString();
label8.Text = cloop.ToString()+" of "+bytes.Length.ToString()+" ("+(cloop*100/bytes.Length).ToString()+"%)";
تصویر خروجی برنامه رو می بینید:
132560
از اساتید محترم خواهشمندم الگوریتم صحیحش رو برام زحمت بکشند.
ممنون
حقیقتش یه الگوریتم می خوام برا یه کار خاصی، خلاصه وار توضیح میدم:
ببینید فرض کنیم آرایه ای بسیار بزرگ از بایت داریم شامل اعداد 0 و 1 مثلا تو یه فایل که در ایندکس های نامشخص ولی پشت سر هم ذخیره شده اند. (در این مثال طول آرایه 2000 بایته) محتوای فایل:
11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111100 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000001111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111100000000000000 00000000000111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000001111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000001111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11000000000000000000000000000000000000000000001111 11111111111111100000000000000000000000000000000000 00000000111111111111111111111111111111111111111111 11111111111111111111111111111111000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000111111111111111111 11111111111111111111111111111111111000000000000111
لطفا این نمونه 0 و 1 ها رو کپی و فاصله ها رو حذف کنید و تو فایل جدیدی با نام bytes.txt تو فولدر Debug پروژه تون بریزید تا خروجی تون با من با اجرای کد یکسان بشه.
حال مساله اینجاست الگوریتمی میخوام که با کمترین تعداد اجرای بدنه حلقه، مثلا تعداد 1 ها را استخراج کند. خودم این کد رو فعلا نوشتم که هر چه بالا پایینش کردم خروجی صحیحی نگرفتم میدونم الگوریتم مزخرفیه!.
byte[] bytes = File.ReadAllBytes(Application.StartupPath + "\\bytes.txt");
int zero = bytes.Where(c => c == 48).Count();
int one = bytes.Where(c => c == 49).Count();
label4.Text = zero.ToString();
label5.Text = one.ToString();
int zCount = 0;
int oCount = 0;
int cloop = 0;
for (int i = 0; i < bytes.Length; i++)
{
cloop++;
bool b = bytes[i] == 49;
if (b)
{
oCount++;
}
else
{
while (!b)
{
if (bytes.Length - i < 10)
{
break;
}
i += 10;
b = bytes[i] == 49;
cloop++;
if (b)
{
i -= 9;
}
}
}
}
label6.Text = oCount.ToString();
label8.Text = cloop.ToString()+" of "+bytes.Length.ToString()+" ("+(cloop*100/bytes.Length).ToString()+"%)";
تصویر خروجی برنامه رو می بینید:
132560
از اساتید محترم خواهشمندم الگوریتم صحیحش رو برام زحمت بکشند.
ممنون