Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметра по ссылке и по значению 
:(
    Опции темы
ChessMaster
Дата 13.8.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Запутался с тем, как передать значение по сслыке, а как по значению. 
Код


public class Zoo{

private List<Monkey> monkeyCage = new ArrayList<Monkey>()
public void addMonkey(Monkey monkey) 

}



public class MAIN{


public satatic void main(){

Monkey monkey = new Monkey();

Zoo zoo = new Zoo();

Zoo.addMonkey(monkey);

Monkey.changeTemperature( int newTemprature);

}


}



Дело в том, что monkey != cageMonkey.get(0);

То есть вклетки сидит мартышка с другой температурой.
PM MAIL   Вверх
agR
Дата 13.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Цитата(ChessMaster @  13.8.2007,  10:13 Найти цитируемый пост)
Запутался с тем, как передать значение по сслыке, а как по значению. 

Честно говоря из примера мало что понятно. 
В Java параметры передаются по значению... для объектных переменных значениями являются ссылки. 
Попытался сделать, че-то по твоей идее, вот что получилось:
Код

package Monkey;

import java.util.ArrayList;

public class MonkeyTest {
    public static void main(String[] args) {
        Zoo zoo = new Zoo();
        Monkey monkey = new Monkey(36.6f);
        Monkey monkey2 = new Monkey(36.6f);
        zoo.addMonkey(monkey);
        monkey.changeTemp(42.2f);
        zoo.addMonkey(monkey2);
        if(monkey == zoo.getList().get(0))  {
            System.out.println("monkey = cageMonkey");
        }
        else {
            System.out.println("monkey != cageMonkey");
        }
        System.out.println("Temp monkey = "+ monkey.getTemp());
        System.out.println("Temp cageMonkey = "+ zoo.getList().get(0).getTemp());
        if(monkey == monkey2) {
            System.out.println("monkey = monkey2");
        }
        else System.out.println("monkey != monkey2");
    }
}
class Monkey {
    public Monkey(float temp) {
        this.temp = temp;
    }
    public float getTemp() {
        return temp;
    }
    public float changeTemp(float newTemp) {
        this.temp=newTemp;
        return temp;
    }
    private float temp;
}
class Zoo {
    public Zoo() {
        monkeyCage = new ArrayList<Monkey>();
    }
    public void addMonkey(Monkey monkey) {
        monkeyCage.add(monkey);
    }
    public ArrayList<Monkey> getList() {
        return monkeyCage;
    }
    private ArrayList<Monkey> monkeyCage;
    
}

П.С. А ты код прям на форуме набирал? smile
PM MAIL ICQ   Вверх
LSD
Дата 13.8.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Объекты всегда передаются по ссылке, а примитивные типы по значению.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
agR
Дата 13.8.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



LSD, 
Цитата(LSD @  13.8.2007,  12:34 Найти цитируемый пост)
Объекты всегда передаются по ссылке, а примитивные типы по значению. 

и
Цитата(agR @  13.8.2007,  11:35 Найти цитируемый пост)
В Java параметры передаются по значению... для объектных переменных значениями являются ссылки. 

Как по мне, то те же грабли, тока в профиль.
Читал книгу, так там акцент как раз и делался, что в java передается по значению... и утверждение  "по ссылке" - ошибочно. Кому верить? smile


PM MAIL ICQ   Вверх
LSD
Дата 13.8.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Для объектов передается копия ссылки на этот объект. И мы можем в теле метода изменить переданную копию ссылки, присвоив ей другой объект.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
ChessMaster
Дата 13.8.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Цитата(LSD @  13.8.2007,  13:28 Найти цитируемый пост)
Для объектов передается копия ссылки на этот объект. И мы можем в теле метода изменить переданную копию ссылки, присвоив ей другой объект. 


LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо smile 
PM MAIL   Вверх
fixxer
Дата 13.8.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Боюсь, LSD ввел в небольшое заблуждение. Изменение (переприсваивание) ссылки возымеет действие только в пределах метода. Ключевая фраза "передается копия ссылки на этот объект". 


--------------------
user posted image
PM MAIL ICQ   Вверх
LSD
Дата 13.8.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код

  public static void main(String[] args)
  {
    StringBuffer string = new StringBuffer("Abc");
    System.out.println("inital = " + string);
    toLowerCase(string);
    System.out.println("after toLowerCase() = " + string);
    toUpperCase(string);
    System.out.println("after toUpperCase() = " + string);
    toCamelCase(string);
    System.out.println("after toCamelCase() = " + string);
  }

  public static void toLowerCase(StringBuffer str)
  {
    for(int i = 0; i < str.length(); i++)
      str.setCharAt(i, Character.toLowerCase(str.charAt(i)));
  }

  public static void toUpperCase(StringBuffer str)
  {
    StringBuffer newStringBuffer = str;
    for(int i = 0; i < newStringBuffer.length(); i++)
      newStringBuffer.setCharAt(i, Character.toUpperCase(newStringBuffer.charAt(i)));
  }

  public static void toCamelCase(StringBuffer str)
  {
    str = new StringBuffer("blablabla");
    for(int i = 0; i < str.length(); i++)
    {
      if(i % 3 == 0)
        str.setCharAt(i, Character.toUpperCase(str.charAt(i)));
      else
        str.setCharAt(i, Character.toLowerCase(str.charAt(i)));
    }
    System.out.println("inside toCamelCase() = " + str);
  }



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
fixxer
Дата 13.8.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Да, безусловно, только пример не отражает фразу
Цитата

И мы можем в теле метода изменить переданную копию ссылки, присвоив ей другой объект. 



--------------------
user posted image
PM MAIL ICQ   Вверх
nornad
Дата 14.8.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(fixxer @  13.8.2007,  22:00 Найти цитируемый пост)
только пример не отражает фразу

А как же это:

Цитата(LSD @  13.8.2007,  19:05 Найти цитируемый пост)
  public static void toCamelCase(StringBuffer str)
  {
    str = new StringBuffer("blablabla");

 smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
fixxer
Дата 14.8.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Да, сорри. Не заметил. Ну тогда будут выведены разные значения внутри и вне метода. Наверно LSD это и хотел продемонстрировать.  smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
chief39
Дата 14.8.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(agR @  13.8.2007,  12:58 Найти цитируемый пост)
Как по мне, то те же грабли, тока в профиль.

Нифига се профиль!!! smile))

Цитата(ChessMaster @  13.8.2007,  14:48 Найти цитируемый пост)
LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо 

Если надо сугубо по значению - тогда clone() объекта и передача клона в качестве параметра.



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 15.8.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(chief39 @ 14.8.2007,  14:05)
Цитата(ChessMaster @  13.8.2007,  14:48 Найти цитируемый пост)
LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо 

Если надо сугубо по значению - тогда clone() объекта и передача клона в качестве параметра.

Ага smile 
Передать по значению нельзя, но можно это дело эмулировать клоном для изменяемых объектов, а для неизменяемых просто передавать как есть.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Fedrus
Дата 24.1.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Как раз сегодня получил ошибку забыв про "передачу объектов по ссылке".
Я передал как new Object(myObject). В поисках более правильного решения погуглил и 
нашел интересную статью http://www.javable.com/columns/robinson/letters/01/
в ней как раз доказывается что в java 
Цитата(agR @  13.8.2007,  11:35 Найти цитируемый пост)
В Java параметры передаются по значению... для объектных переменных значениями являются ссылки. 

Потом залез на форум и нашел эту тему и окончательно запутался(LSD привык верить) и сегодня сильно не выспался чтоб полностью понять статью может посмотрите и всетаки дадите определенный ответ.

Это сообщение отредактировал(а) Fedrus - 24.1.2008, 11:16
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
LSD
Дата 24.1.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



По сути тут утверждается одно и то же. Для примитивных типов в стеке создаётся копия этой переменной. Для объекта - создаётся копия ссылки на этот объект.

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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Мурлыкатам_
Дата 10.11.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Простите, что я продолжаю тему, я честно гуглил и честно смотрел статьи на форуме, но так и не понял как передать по ссылке к примеру массив целых чисел.

Задача: отсортировать массив случайных чисел от 0 до 5000, записанных в файл размером 1 мб, т.е. в файле 1 мб этих чисел. 

Решение (сразу сделал под .net): решаю задачу через алгоритм быстрой сортировки (QuickSort: http://ru.wikipedia.org/wiki/Quicksort#Java.2FC.23), получается быстро, но не достаточно. Передаю массив через ref, и о чудо, все сортируется меньше чем за секунду...

Проблема: задача была поставлена для java, реализую все на java и сталкиваюсь с невозможностью передать массив по ссылке, в результате сортировка 100кб массива - 53 секунды. Очевидно проблема в постоянной передачи массива по значению.

Верно ли я понял, что для решения этой задачи мне нужно просто массив завернуть в класс, сделать экземпляр этого класса и вместо массива передавать экземпляр класса для увеличения производительности?

Если нет, то подскажите плз что-нить, потому что уже -  smile 


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
powerOn
Дата 10.11.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



вообще-то, массивы в java всегда передаются по ссылке...  smile 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Мурлыкатам_
Дата 10.11.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Хммм... завтра выкину код. smile Может в руках дело smile


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Дрон
Дата 10.11.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 92



Цитата(powerOn @  10.11.2008,  20:44 Найти цитируемый пост)
вообще-то, массивы в java всегда передаются по ссылке...

Ровно как и в .NET

Поэтому сказанное ниже очень странно:
Цитата(Мурлыкатам_ @  10.11.2008,  19:20 Найти цитируемый пост)
Передаю массив через ref, и о чудо, все сортируется меньше чем за секунду...


Так что ждём код smile




--------------------
Да. Именно так.
PM   Вверх
SoulKeeper
Дата 11.11.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



По алгоритму с Википедии вываливается StackOverflowError на 100кб массиве.

P.S. 100кб массив (1024 * 1024 / 4) элементов?

Это сообщение отредактировал(а) SoulKeeper - 11.11.2008, 10:53
PM MAIL   Вверх
LSD
Дата 11.11.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(SoulKeeper @  11.11.2008,  10:50 Найти цитируемый пост)
По алгоритму с Википедии вываливается StackOverflowError на 100кб массиве.

Как тебе это удалось?
Код

import java.util.Random;

public class QSort {
  public static final int ARRAY_SIZE = 8 * 1024 * 1024;

  public static int partition(int[] m, int a, int b) {
    int i = a;
    for(int j = a; j <= b; j++) {
      if(m[j] <= m[b]) {
        int t = m[i];
        m[i] = m[j];
        m[j] = t;
        i++;
      }
    }
    return i - 1;
  }

  public static void quickSort(int[] m, int a, int b) {
    if(a >= b) return;
    int c = partition(m, a, b);
    quickSort(m, a, c - 1);
    quickSort(m, c + 1, b);
  }

  public static void main(String[] args) {
    int[] ints = new int[ARRAY_SIZE];
    Random rnd = new Random();
    for(int i = 0; i < ints.length; i++) {
      ints[i] = rnd.nextInt();
    }

    quickSort(ints, 0, ARRAY_SIZE - 1);

    for(int i = 1; i < ints.length; i++) {
      if(ints[i - 1] > ints[i]) {
        System.err.printf("Array not sorted a[%1$d] = %2$d, a[%3$d] = %4$d; %n", i - 1, ints[i - 1], i, ints[i]);
        break;
      }
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Мурлыкатам_
Дата 11.11.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Цитата(Дрон @  10.11.2008,  21:10 Найти цитируемый пост)
вообще-то, массивы в java всегда передаются по ссылке...

Ровно как и в .NET


Точно  smile 

Все таки хромала реализация  smile 
Я еще чуток поковыряюсь сам, а если не получиться, то напишу, стыдно немного кривоватый код показывать smile

Хотя словом, "немного" я наверное себе зальстил smile

Реализация уважаемого LSD, работает просто выше всяких похвал.

Спасибо!


Это сообщение отредактировал(а) Мурлыкатам_ - 11.11.2008, 14:12


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
SoulKeeper
Дата 11.11.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Цитата(LSD @ 11.11.2008,  13:14)
Как тебе это удалось?

Хмм... таки не вываливается.
Может что-то умудрился поломать пока копипейстил smile

EDIT:
Код

public static final int ARRAY_SIZE = 8 * 1024 * 1024;


тут если 8 поменять на 32, то вывалиться ;)

Это сообщение отредактировал(а) SoulKeeper - 11.11.2008, 13:55
PM MAIL   Вверх
LSD
Дата 11.11.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(SoulKeeper @  11.11.2008,  13:49 Найти цитируемый пост)
тут если 8 поменять на 32, то вывалиться ;)

Дык вываливается с OutOfMemoryError, а не StackOverflowError. Что вполне законно, т.к. массив занимает 128 мегабайт памяти, а по умолчанию JVM берет себе 32 мегабайта. Надо просто запустить с ключём -Xmx140m и все заработает.
OutOfMemoryError это простая нехватка памяти, решается ключами запуска. А вот StackOverflowError уже более серьезная проблема, как правило это бесконечная или слишком "глубокая" рекурсия.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SoulKeeper
Дата 11.11.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Код

Exception in thread "main" java.lang.StackOverflowError
    at SortDemo.quicksort(SortDemo.java:41)
    at SortDemo.quicksort(SortDemo.java:42)
    at SortDemo.quicksort(SortDemo.java:42)
...


Код

import java.util.Random;

public class SortDemo {

  public static void main(String[] args) {

    int length = 1024 * 1024 * 32;
    int[] arr = new int[length];

    Random rnd = new Random();
    for (int i = 0; i < arr.length; i++) {
      arr[i] = rnd.nextInt(5000);
    }

    long time = System.currentTimeMillis();
    quicksort(arr, 0, length - 1);
    // Arrays.sort(arr);
    System.out.println(System.currentTimeMillis() - time);
    System.out.println("Sorted");
  }

  private static int partition(int[] m, int a, int b) {
    int i = a;
    for (int j = a; j <= b; j++) // просматриваем с a по b
    {
      if (m[j] <= m[b]) // если элемент m[j] не превосходит m[b],
      {
        int t = m[i]; // меняем местами m[j] и m[a], m[a+1], m[a+2] и так далее...
        m[i] = m[j]; // то есть переносим элементы меньшие m[b] в начало,
        m[j] = t; // а затем и сам m[b] «сверху»
        i++; // таким образом последний обмен: m[b] и m[i], после чего i++
      }
    }
    return i - 1; // в индексе i хранится <новая позиция элемента m[b]> + 1
  }

  public static void quicksort(int[] m, int a, int b) // a - начало подмножества, b - конец
  { // для первого вызова: a = 0, b = <элементов в массиве> - 1
    if (a >= b)
      return;
    int c = partition(m, a, b);
    quicksort(m, a, c - 1);
    quicksort(m, c + 1, b);
  }
}




Отличить нехватку памяти от переполнения стэка я еше могу.

Это сообщение отредактировал(а) SoulKeeper - 11.11.2008, 16:35
PM MAIL   Вверх
LSD
Дата 11.11.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата
Худший случай. Худшим случаем, очевидно, будет такой, при котором на каждом этапе массив будет разделяться на вырожденный подмассив из одного опорного элемента и на подмассив из всех остальных элементов. Такое может произойти, если в качестве опорного на каждом этапе будет выбран элемент либо наименьший, либо наибольший из всех обрабатываемых.
Худший случай даёт O(n²) обменов, но количество обменов и, соответственно, время работы — это не самый большой его недостаток. Хуже то, что в таком случае глубина рекурсии при выполнении алгоритма достигнет n, что будет означать n-кратное сохранение адреса возврата и локальных переменных процедуры разделения массивов. Для больших значений n худший случай может привести к исчерпанию памяти во время работы алгоритма. Впрочем, на большинстве реальных данных можно найти решения, которые минимизируют вероятность того, что понадобится квадратичное время.
....
Представленные здесь реализации, кроме варианта на языке Паскаль, используют в качестве опорного элемента один из крайних элементов подмассива. Все эти реализации страдают одним общим недостатком: при передаче им уже отсортированного массива в качестве параметра они приводят к самому худшему случаю.

Вот в чем проблема. Надо доработать метод partition().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SoulKeeper
Дата 11.11.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Честно говоря я вообще не понимаю зачем использовать данный велосипед. Arrays.sort() работает и быстрее и вылеты оверфловы за ним не замечались ;)
PM MAIL   Вверх
LSD
Дата 11.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну я считаю, что знать базовые алгоритмы полезно и нужно. Тем более что Arrays.sort() сам использует quicksort, хотя там конечно реализация более грамотная с защитой от подобных проблем.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SoulKeeper
Дата 11.11.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Что-то не верится что на этом форуме наберется десяток программистов которые смогут написать по памяти хоть пару из 
этих алгоритмов


Одно дело знать что они существуют, другое - их писать.
PM MAIL   Вверх
LSD
Дата 11.11.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Пузырек и сортировку слиянием думаю напишут многие smile Не надо их знать на память, достаточно знать что они есть и знать про их особенности (потребление дополнительной памяти, отношение к частично упорядоченным данным и т.п.). Чтобы в случае необходимости знать какой алгоритм стоит использовать (готовую реализацию найти не проблема).

А вообще это все оффтопик.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Мурлыкатам_
Дата 11.11.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Я думаю каждый программист использует сортировку в своей жизни  smile 

Поэтому зная алгоритм и его реализацию, лучше один раз написать сортировку самому и понять, как она работает, чем использовать кота в мешке =))) или каждый раз искать алгоритм в инете.

Цитата(SoulKeeper @  11.11.2008,  17:47 Найти цитируемый пост)
Что-то не верится что на этом форуме наберется десяток программистов которые смогут написать по памяти хоть пару из 


Мне тоже не вериться, потому что их число будет значительно больше  smile 

Да и в любом случае понимание алгоритма лучше, чем бездумное использование готового!


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
kashka
Дата 17.4.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

Репутация: 1
Всего: 1



Теперь мне по крайней мере понятно почему у меня не работает след. (транспонирование двухмерногоа массива)
Код

    public static void trasponseArray(Object[][] array) {        
        
        int n = array.length;
        int m = array[0].length;
        
        Object[][] temp = new Object[n][m];
        
        
        for (int i = 0; i < n; i++) {            
            for (int j = 0; j < m; j++) {
                temp[i][j] = array[i][j];
            }
            System.out.println();
        }        
        
        array = new Object[m][n];
        
        for (int i = 0; i < temp.length; i++) {
            for (int j = 0; j < temp[i].length; j++) {
                array[j][i] = temp[i][j];
            }
        }

        
    }


Так как передаётся не сама ссылка а её копия, хм...Так это что же получается нет никакой другой возможности кроме как return добавлять? 
PM MAIL   Вверх
kashka
Дата 17.4.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2004
Где: Wolfenbuettel, Ge rmany

Репутация: 1
Всего: 1



Что то я торможу, второй массив мне и не нужен вовсе:
Код

    public static void trasponseArray(Object[][] array) {        
        
        int n = array.length;
        int m = array[0].length;
        
        for (int i = 0; i < n; i++) {            
            for (int j = i + 1; j < m; j++) {
                Object temp1 = array[i][j];
                Object temp2 = array[j][i];
                array[j][i] = temp1;
                array[i][j] = temp2;
            }            
        }
        
    }


Но работает это конечно только для nxn массивов.
PM MAIL   Вверх
goodday1941
Дата 17.4.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 1
Всего: 9



Цитата(kashka @  17.4.2009,  13:02 Найти цитируемый пост)
Так как передаётся не сама ссылка а её копия, хм...Так это что же получается нет никакой другой возможности кроме как return добавлять?  


как насчет варианта с враппером?

Код

class ArrayWrapper{
private Object[][]array;
//getter.. setter
}


..

ну и метод транспонирования будет получать на вход объект класса ArrayWrapper
Код


trasponseArray(ArrayWrapper arrayWrapper);


Это сообщение отредактировал(а) goodday1941 - 17.4.2009, 17:57


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
math64
Дата 17.4.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если лень создавать враппер, сойдёт и массив из одного элемента:
Код

void trasponseArray(Object[][][] parray) {
  ...
}
...
Object[][] array;
...
Object[][][] parray = { array };
trasponseArray(parray);
array = parray[0];

PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1683 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.