PDA

View Full Version : سوال: حذف خروجی تکراری در برنامه



mornwk
سه شنبه 19 فروردین 1393, 00:36 صبح
سلام
من یه برنامه دارم مینویسم که هر بار خروجی زیر رو (اعداد مثال هستند) تولید میکنه. در واقع 8 تا عضوه که هر کدوم داره سطر و ستون ماتریس رو نشون میده.اما چون باید خروجی تولید شده در هر بار اجرا تکراری نباشه نمیدونم چی کار کنم که نتایج تکراری دوباره تو خروجی نمایش داده نشن. یعنی میخوام یه جوری همه ی خروجی ها از اول یه جا ذخیره بشن و هر خروجی با قبلیا مقایسه بشه و اگه تکراری بود دوباره نمایش داده نشه. البته شرط تکراری بودن اینه که اگه هر ۸ تا عضو با هر ۸ تای دیگه یکی بود نمایش داده نشه ولی اگه حداقل تو یکی از عضوها اختلاف داشتن اشکال نداره. لطف کنید راهنمایی کنید چطوری پیاده سازی کنم ممنون میشم.


[0],[4]
[1],[4]
[2],[3]
[3],[5]
[4],[7]
[5],[1]
[6],[5]
[7],[2]

ali chegini
سه شنبه 19 فروردین 1393, 11:13 صبح
سلام.
اگر سطر و ستون ماتریس ثابته . اون ماتریس رو به صورتی خطی در نظر بگیر و hash کد همه ی ماتریس هارو تو یه فایل بریز
حالا مقایسه سرعت بیشتری پیدا میکنه.
اما اگه بخوای خود ماتریس رو تو فایل ذخیره کنی باید برای هر فایل m*n تا مقایسه انجام بدی.

mornwk
سه شنبه 19 فروردین 1393, 11:37 صبح
سلام.
اگر سطر و ستون ماتریس ثابته . اون ماتریس رو به صورتی خطی در نظر بگیر و hash کد همه ی ماتریس هارو تو یه فایل بریز
حالا مقایسه سرعت بیشتری پیدا میکنه.
اما اگه بخوای خود ماتریس رو تو فایل ذخیره کنی باید برای هر فایل m*n تا مقایسه انجام بدی.

میشه بیشتر توضیح بدید. مثلا اینکه چطوری
hash کد رو تولید کنم و تو فایل بریزم و چطوری باید مقایسه انجام بشه؟ ممنون

ali chegini
پنج شنبه 21 فروردین 1393, 11:49 صبح
سلام.در مورد تولید هش میتونی از توابع آماده استفاده کنی کافیه یه سرچ کنی.
ماتریس به صورت خطی یعنی (1 سطر و n ستون) به ورودی تابع هش بده یه خروجی منحصر به فرد بهت میده . حالا اون خروجی رو به صورت رشته تو فایل ذخیره کن.
برای مقایسه میتونی ماتریس مورد نظرت رو به صورت خطی بدی به تابع هش بعد خروجی تابع رو مقایسه کنی با اطلاعاتی که خط به خط از فایل می خونی.
شبه کد:
matrix m1;
string hash_res=MD5(m1);// get hash code
write_to_file(hash_res);//store result
string str_from_file;
while(!eof(input_file)
{

str_from_file=read_from_file();

if(hash_res==str_from_file)
{
این ماتریس قبلا ذخیره شده
}
else
{
ماتریس جدید است
}
}

ebi_khatar00
شنبه 23 فروردین 1393, 14:18 عصر
چه کاریه؟
احساس نمیکنی داری میپیچونی قضیه رو؟

omid_kma
دوشنبه 25 فروردین 1393, 02:04 صبح
در جریان هستین که نوشتن داخل فایل بعد دوباره خوندن چقدر باعث کند شدن برنامه میشه دیگه ؟
یک راه ساده و بهینش میتونه این باشه که از std::set استفاده کنی و زمان اضافه شدن عنصر تکراری بودن رو چک کنی
کدش این جا گذاشته شده حذف خروجی تکراری
(http://www.7khatcode.com/index.php?qa=2941&qa_1=%D8%B3%D9%88%D8%A7%D9%84-%D8%AD%D8%B0%D9%81-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-c)

rahnema1
دوشنبه 25 فروردین 1393, 10:16 صبح
سلام
اگه هدف شما این باشه که هر دفعه 8 عنصر را به صورت تصادفی از یک آرایه استخراج کنید و در ضمن این 8 عنصر هم با عناصر قبلی متفاوت باشند کافیه لیست اندکس ها را درست کنید و با تابع shuffle اونها را به هم بریزید و هر دفعه 8 تا از اون را انتخاب کنید
مثلا یک آرایه داریم با 10 سطر و 4 ستون
و می خواهیم هر دفعه 8 تا را استخراج کنیم:

#include <array>
#include <random>
#include <chrono>
#include <cstdio>
#include <algorithm>
const int height=10,width=4;
int main()
{
std::array<int,width*height> index;
for(int i=0;i<index.size();i++) index[i]=i;
unsigned seed = std::chrono::system_clock::now().time_since_epoch( ).count();
shuffle (index.begin(), index.end(), std::default_random_engine(seed));
int j=0;
for(int m=1;m<6;m++)
{
for(int n=1;n<9;n++)
{
printf("%d.[%d][%d]\n",n,index[j]/width,index[j]%width);
j++;
}
printf("****\n");
}
return 0;
}