Assalomu alaykum, yordam.uz saytimizga xush kelibsiz.
Bu saytda o`zingizni qiziqtirgan savollarga javob olishingiz va o`z sohangiz bo`yicha savollarga javob berishingiz mumkin. Bizning Oilamizga a'zo bo`lganingiz uchun chuqur Minnatdorchilik bildiramiz !!!

Optimal yo'lni topish (Algoritm)

+2 ovoz
145 marta ko‘rilgan
so‘radi 20 yanvar, 18 Shoh (109 bal)

Bir o'lchovli massiv berilgan uning o'lchami 1024 ga teng. Massivni -1,1 va 0 qiymatlari bilan to'ldirish kerak.
Sharti shundaki -1 va 1 lar soni 128 tani tashkil qilsin va bu sonlar random (tavakkal tarzda, случайным образом)  joylashishi kerak massivda. Yana massivni har bir elementining 1 yoki -1 bo'lish extimoli teng bo'lishi kerak

Masala juda oddiy lekin eng optimal usulda yechish kerak. Yani optimal deganda, programani "performance" i vaqt buyicha manikidan 10%-20% tezroq ishlashi kerak.  Va massivning har bir indexdagi elementini 1 yoki -1 bo'lish extimolligi mani kodimniki bilan bir xil bo'lishi kerak. 
Men o'z usulimni attach qilyapman. Kodim C da yozilgan. Kim menikidan optimalroq usulda 
ishlab bersa o'sha odamni rozi qilaman. Bu muammoni yechish menga juda zarur edi
shuning uchun rozi qilaman deyapman.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <chrono>
#include <sys/time.h>

void get128NonZeroItems_MYCODE()
{
	int idx_tmp;
	int sk[1024] = {};
	int count = 0;
	int tmp;
	while (count < 128)
	{
		idx_tmp = rand() % 1024;

		if (!sk[idx_tmp])
		{
			tmp = rand() % 2;
			if (tmp)
				sk[idx_tmp] = 1;
			else
				sk[idx_tmp] = -1;
			count++;
		}
	}
}

int main(void)
{
	struct timeval tv;
	gettimeofday(&tv, NULL);
	srand(tv.tv_usec);
	
    
	auto started = std::chrono::high_resolution_clock::now();
	auto done = std::chrono::high_resolution_clock::now();
	std::cout << "INIT " << std::chrono::duration_cast<std::chrono::microseconds>(done - started).count() << std::endl;
	
        for(int m = 0; m < 1000; m++){
        
    	started = std::chrono::high_resolution_clock::now();
    	get128NonZeroItems_MYCODE();
    	done = std::chrono::high_resolution_clock::now();
    	std::cout << "MYCODE\t" << std::chrono::duration_cast<std::chrono::microseconds>(done - started).count() << std::endl;
	}
	std::cout << "END" ;
	return 0;
}

Iltimos, saytga kiring yoki ro‘yxatdan o‘ting va shunda ushbu savolga javob berishingiz mumkin bo‘ladi.

Assalomu alaykum, yordam.uz saytimizga xush kelibsiz.

Bu saytda o`zingizni qiziqtirgan savollarga javob olishingiz va o`z sohangiz bo`yicha savollarga javob berishingiz mumkin.

Bizning Oilamizga a'zo bo`lganingiz uchun chuqur Minnatdorchilik bildiramiz !!!

Telegram kanal YordamUzRss

...