2013-11-08 2 views
0

У меня есть массивPerl разделение массива на небольшие массивы, используя разницу между значениями

my @stuff = (6.5,6.54,6.465,6.3,6.42,8.07370,8.1165,8.07612,7.61855,6.94927,6.94072,8.09707,6.94468,7.55948,6.93,7.51448,8.02872,6.89643,7.44893,6.92997,7.46780,7.96705,6.93785,6.928,7.51177,7.93443,6.92620,7.40470,7.90602,8.39247,6.95032,7.42932,7.917,6.95272,7.93688,8.42192,6.95255,7.45207,8.43418,7.42768,8.42152,6.9645); 

Я хочу разделить это на меньшие массивы, где аналогичные номера могут быть сгруппированы вместе, без указания количества массивов. Я хочу, чтобы значения в каждом меньшем массиве не превышали 0,5.

+0

Я предполагаю, что вас не интересует заказ в ваших данных? – ceving

+2

Желание не достаточно, попробуйте что-нибудь. Я считаю, что вы можете это сделать – Suic

+0

ok, я получил его благодаря – statstar

ответ

4

Это простой вариант. Похоже на назначение в классе perl. Я не буду вдаваться в подробности, но простым решением будет сортировка массива. Затем вы повторяете и проверяете разницу между текущим и первым элементом. Как только ваш текущий элемент отличается от вашего дельта (0.5) от первого, вы разделите массив в этой позиции. Затем вы начинаете с сокращенного массива.

Существует множество вариантов того, как это сделать. Я уверен, что вы придумаете умный.

1
my @stuff = (6.5,6.54,6.465,6.3,6.42,8.07370,8.1165,8.07612,7.61855,6.94927,6.94072,8.09707,6.94468,7.55948,6.93,7.51448,8.02872,6.89643,7.44893,6.92997,7.46780,7.96705,6.93785,6.928,7.51177,7.93443,6.92620,7.40470,7.90602,8.39247,6.95032,7.42932,7.917,6.95272,7.93688,8.42192,6.95255,7.45207,8.43418,7.42768,8.42152,6.9645); 
my (%h, @g); 

my @r = map { 
    my $el = $_; 
    my ($ref) = map { abs($_-$el) <=0.5 ? $h{$_} :() } @g; 

    if ($ref) { push @$ref, $_; } 
    else { 
    $h{$_} = [$_]; 
    push @g, $_; 
    } 
    $ref ?() : $h{$_}; 
} 
sort { $a <=> $b } 
@stuff; 

use Data::Dumper; print Dumper \@r; 

выход

$VAR1 = [ 
     [ 
     '6.3', 
     '6.42', 
     '6.465', 
     '6.5', 
     '6.54' 
     ], 
     [ 
     '6.89643', 
     '6.9262', 
     '6.928', 
     '6.92997', 
     '6.93', 
     '6.93785', 
     '6.94072', 
     '6.94468', 
     '6.94927', 
     '6.95032', 
     '6.95255', 
     '6.95272', 
     '6.9645' 
     ], 
     [ 
     '7.4047', 
     '7.42768', 
     '7.42932', 
     '7.44893', 
     '7.45207', 
     '7.4678', 
     '7.51177', 
     '7.51448', 
     '7.55948', 
     '7.61855' 
     ], 
     [ 
     '7.90602', 
     '7.917', 
     '7.93443', 
     '7.93688', 
     '7.96705', 
     '8.02872', 
     '8.0737', 
     '8.07612', 
     '8.09707', 
     '8.1165', 
     '8.39247' 
     ], 
     [ 
     '8.42152', 
     '8.42192', 
     '8.43418' 
     ] 
    ]; 
0

Это общая проблема кластеризации. Вы должны взглянуть на алгоритмах кластеризации, как

k-means или k-median для кластерной части и k-means++, чтобы получить хорошие к (число кластеров)

Имейте в виде, что мое предложение является более сложным, чем те, из других ответов, но если вы хотите углубиться в такие алгоритмы и нуждаться в решениях не только для 0,5 дельта, это некоторые моменты для начала.

Смежные вопросы