Помогите написать алгоритм сравнения

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Anifuck, 18 Feb 2013.

  1. Anifuck

    Anifuck Member

    Joined:
    12 Nov 2010
    Messages:
    78
    Likes Received:
    7
    Reputations:
    0
    Ачат прошу помощи :confused:
    Нам даны два строковых массива, в строках восьмизначные числа. первый массив 100 млн значений второй массив 10 000 значений. Нужно сравнить каждую строку из второго массива с каждой строкой из первого и при наличии отличий удалить строку из второго массива.
    Надеюсь задача понятна, очень нужно ребят, благодарен буду!
    ЯП не важен
     
    #1 Anifuck, 18 Feb 2013
    Last edited: 18 Feb 2013
  2. qaz

    qaz Elder - Старейшина

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    както калечно ты написал, ну если я правильно тебя понял и тебе ножно вывести из массива2 то что есть в массиве1( при наличии отличий удалить строку из второго массива)

    PHP:
    <?php
    $arrat_one 
    = array(1234,2376896745,34523,352768345,2345);
    $arrat_two = array(1234,2345,3786974523,352345);
    $arrat_three = array();

    foreach( 
    $arrat_two as $at )  {

    if( 
    in_array$at $arrat_one) ) {

        
    $arrat_three[] = $at;                                      
                                      }
                                                    }

    print_r($arrat_three);

    ?>
     
  3. Anifuck

    Anifuck Member

    Joined:
    12 Nov 2010
    Messages:
    78
    Likes Received:
    7
    Reputations:
    0
    не совсем, при наличии определенного кол-ва отличий. тоесть если между строкой 1 и 2 у нас 3 отличия то строка отсеивается. а если менее то остается.

    Основная проблема это скорость мой алгоритм будет месяц считать эти варианты....
     
  4. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Можно использовать предварительную сортировку большего массива, и ограничить дальнейший проход по массиву. Также можно предварительно, после сортировки, разбить больший массив на диапазоны, и сравнивать входить ли элемент в какой-то диапазон или нет.
     
  5. Anifuck

    Anifuck Member

    Joined:
    12 Nov 2010
    Messages:
    78
    Likes Received:
    7
    Reputations:
    0
    С дальнейшим проходом понятное дело, но оно не так сильно будет резать время работы программы. а вот насчёт разбиения на диапазоны это интересно.
     
  6. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Можно еще отсортировать оба массива, и сохранять позицию в большем массиве после каждого сравнения.
     
  7. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    Собственно, сам алгоритм (дабы мозгом и ты поработал - допили :))

    c#

    Code:
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace csharpSpeed
    {
        class Program
        {
            private static List<string> readLinesRange(string file, int begin, int end)
            {
                List<string> res = new List<string>();
                int line = 0;
    
                using (StreamReader sr = new StreamReader(file))
                {
    
                    while (line <  begin)
                    {
                        sr.ReadLine();
                        line++;
                    }
    
                    while (line < end)
                    {
                        res.Add(sr.ReadLine());
                        line++;
                    }
                    sr.Close();
                }
    
                return res;
            }
    
            static void Main(string[] args)
            {
                DateTime begin_time = DateTime.Now;
                int bigLines = 1000000; //всего строк в большем списке
                int smallLines = 100; //всего строк в меньшем списке
                int step = 10000; //шаг (для большого списка).. т.е. по 10000 строк за проход цикла
                List<string> bigList = new List<string>();
                List<string> smallList = readLinesRange("e:\\out_small.txt", 0, smallLines); //всего строк в меньшем списке
    
    
                //с какой линии считать следующий диапазон линий ?
                int last = 0;
    
                for (int a = 1; a <= bigLines / step; a++)
                {
                    bigList = readLinesRange("e:\\out.txt", last, step * a);
    
                    //сделующее начало диапазона = текущие начало диапазона + шаг
                    last += step;
    
    
                    //сравнение тут... собственно, тут делай проверки с меньшим списком
    
    
    
                    //очистить буффер после проведения сравнений
                     bigList.Clear();
                    GC.Collect();
                }
    
                Console.WriteLine("Done !");
                TimeSpan end_time = (DateTime.Now - begin_time);
                Console.WriteLine("Done in h{0}:m{1}:s{2}:ms{3} ", end_time.Hours, end_time.Minutes, end_time.Seconds, end_time.Milliseconds);
                Console.ReadKey();
            }
        }
    }
    
    
    Файл с 1000000 строками за 3.5 секунды в буффер по 10 000 линий. Собственно от тебя требуется только замутить вложенный цикл для сравнения с меньшим списком строк... Не думаю что это потребует слишком много усилий... Сам алгоритм, думаю, ясен. Брать в диапазоны и сравнивать, ибо это огромный выигрыш в скорости. Однако, чем больше раз мы проходим цикл (т.е. чем шаг меньше), тем производительность считывания из файла меньше (т.к. приходится записывать строки в список опять и опять)...
     
    #7 DeepBlue7, 20 Feb 2013
    Last edited: 20 Feb 2013
Loading...
Similar Threads - Помогите написать алгоритм
  1. Peja
    Replies:
    0
    Views:
    2,728