2013-09-24 6 views
0

У меня есть следующее выражение: (2^i * 3^j), i, j> = 0, и мне нужно перечислить его в порядке возрастания, т. Е. 1 2 3 4 6 8 9 12 ....Перечислить алгебраическое выражение в порядке возрастания

Я думал о том, чтобы сделать следующее: поддерживать очередь приоритетов. Для текущего (i, j) мы можем либо увеличить i, либо увеличивать j. Вычислите выражение для этих новых значений и вставьте их в очередь приоритетов. Поп из очереди и продолжайте. Начнем с (0,0). Нам также необходимо поддерживать (i, j) вместе с вычисленным выражением. Кроме того, необходимо игнорировать дубликаты.

Я хотел знать, был ли более быстрый способ перечислить указанное выше выражение, поддерживая меньшее состояние?

ответ

1

Что-то в этом роде.

results = [1] 
i_index = 0 
j_index = 0 
for(count=0, count<n, count ++){ 
    i_incr = results[i_index]*2 // next value of expression by incrementing i 
    j_incr = results[j_index]*3 // next value of expression by incrementing j 
    if (i_incr > j_incr) 
     results << j_incr 
     j_index += 1 
    else if (i_incr < j_incr) 
     results << i_incr 
     i_index += 1 
    else 
     results << i_incr 
     i_index += 1 
     j_index += 1 
    end 
    } 

состояние поддерживается i_index и j_index, они отслеживают последнее значение, которое не увеличивается на единицу для этих показателей соответственно. ,

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