2011-12-15 4 views
3

Вы можете чувствовать себя странно, о чем я спрашиваю, но это правда, конвертировать 1 two-dimensional array в one-dimensional arrays.Преобразовать один двумерный массив в двух одномерных массивов

Это то, что мой учитель спросил, и он сказал, что даст идеальный момент для тех, кто отвечает на этот (я думаю, сложный) вопрос. Я был бы счастлив преобразовать любой 2 или n-мерный массив в один одномерный массив. Но он сказал 2, поэтому я думаю, что должно быть что-то делать со вторым массивом. И он не сообщил, какой тип массива (int, String или object), поэтому я предполагаю, что это должно быть сделано с любым видом двумерного массива.

Это то, на что я отвечу, если никто здесь не выяснит, что ему нужно: превратитесь в одномерный массив и оставьте второй нуль (или пусть он не имеет элемента). Но я не думаю, что это хороший ответ на такой сложный вопрос.

EDIT: Вот мой вопрос учителя, слово за словом (он просто спрашивает в конце сеанса в голосе, а не в учебнике, в качестве бонусного вопроса (с ... приятным бонусным вознаграждением):: a2-dimensional array, конвертировать его в два1-dimensional array с.

Я не знаю, считалось ли [] [] в Java и C# 2-dimensional array, но у C# есть [,], который является двумерным массивом. Мы изучаем компьютерный алгоритм без целевой IDE или языка.

EDIT2: Я послал по электронной почте ему, и он отказался дать дополнительную информацию (он сказал, что это несправедливо по отношению к другим, если у меня есть больше информации, чем их), и он не давал никаких комментариев по поводу рваной идеи массива. Единственное полезное в его ответе: Пусть [] [] будет рассмотрено 2-dimensional array.

+4

Учитывая, что Java на самом деле не имеет * двумерных массивов (таких как массивы массивов), трудно дать хороший ответ. Это действительно помогает задать точный вопрос - в идеале - с учетом ввода и ожидаемого результата. Я не думаю, что этот вопрос необходим «сложно» как «недостаточно четко». –

+0

Это больше похоже на головоломку бокового мышления, чем на проблему с кодированием. т. е. какой трюк он использует, делает то, что он сказал, имеет смысл, как только вам дается дополнительная информация. –

+0

Не могли бы вы разместить (или ссылку) точную формулировку вопроса преподавателя? – 01d55

ответ

1

Сгладьте 2-мерный массив в строчном порядке или в столбце с большим объемом, сохраняя его в одном массиве 1-d. Сохраните форму {n, m} массива в другом массиве 1-d integer. Учитывая индексы для элемента в 2-мерном массиве значений, вы можете использовать форму для вычисления индекса в 1-м массиве значений.

Два представления изоморфны, и оба позволяют искать значения в постоянное время. Это также похоже на то, как 2-й массив представлен в памяти.

+0

Большое спасибо. Благодаря вам, я получил идеальный момент! –

+0

Добро пожаловать! Если вы написали какой-либо код, чтобы продемонстрировать этот подход, я надеюсь, вы его отредактируете для всех, кто увидит ваш вопрос в будущем. –

6

Я буду кусать. Можно сгладить весь двумерный массив в первый из двух одномерных массивов простым чтением и письмом. То есть сохранить строку 1, затем строку 2 и т. д. последовательно в этом первом массиве. Всякий раз, когда вы переходите к следующей строке, сохраните индекс этой следующей ячейки (первого одномерного массива) во втором одномерном массиве, который по существу станет таблицей индексов строк.

Как сказал Джон Скит, это не очень хорошо заданный вопрос; возможно, с уточненной информацией, мы могли бы помочь вам.

+1

Возможно, стоит заметить, что 2-й массив не требуется для 2D-массива (поскольку длины строк являются постоянными), но это потребовалось бы для зубчатого массива , –

+0

вам не нужен массив индексов строк, поскольку он может быть рассчитан для массива 2d (он не зубчатый) –

+0

Я отредактировал свой вопрос, чтобы добавить дополнительную информацию. Я не думаю, что второй массив необходим в вашем решении, потому что мы можем обращаться к «1-мерному массиву» операторами математики. –

1

Я думаю, вы хотите преобразовать массив 2-разнесения (набрал RelevantType[,]) в 2 массива (набрал SomeTypeA[] и SomeTypeB[]), не теряя при этом никакой информации?

Это не очень сложно: Иметь первый массив будет типа RelevantType[], второй типа int[], скопировать содержимое вашего 2-dimensionnal массива в первый и ее первые индексы во второй, а ты «Сделано.

+0

Он ничего не сказал о типе массива, поэтому, я думаю, мне нужно преобразовать 'someType [,]' в 2 'someType []' s, и да, вы правы в одном: никакой информации не потеряно. –

2

Если я правильно понял ваш вопрос правильно

легко m8 ...

это только алгоритм вопрос .. не язык программирования конкретного ...

вы можете сделать это следующим образом:

  1. один массив содержит значение
  2. второго массив хранит ключи
  3. попытаться найти обходной путь во втором массиве, чтобы узнать, какие клавиши вы имеете получил ..

    For example: 
    array_1: v0 v1 v2 null v3 v4 v5 null v6 v7 v8 null 
    array_2: 0 1 2 newR 0 1 2 newR 0 1 2 newR 
    

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

Проблема заключается в том, что вы не будете получать доступ к данным сразу из памяти .. поэтому есть би-мерные массивы

Другой способ:

  1. сохранить в массиве 1 значений
  2. держать во втором массиве ключи в виде строки, как показано в следующем примере:

    array1: value1 value2 value3 value4 value5 
    array2: 0,0 0,1 1,0 1,1 2,0 
    

есть много алгоритмов, но я не думаю, что вы найдете лучше, чем би-мерных массивов ...

Когда вы смотрите за ними вы будете иметь меньшую производительность .. OFC .. если не держать их в hashtables .. hashing 0,0 и добавляется как ключ в хэш-таблицу и добавляет указанное значение к этому ключу. тогда вы будете искать ключ «0,0» ...

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