Здравствуйте, TimurSPB, Вы писали:
TSP> В общем пока все возятся со всякими Java/C#/C++, в мире Дельфи уже наступило светлое будущее (пока 32-х битное правда)!
Йоу! Последние сводки с фронта:
Milestone: 64bit compiler now merged into the main dev branch! All devs are now locked and loaded!
Здравствуйте, enji, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
HA>>>Еще не сдаюсь HA>>>Оценка сложности DFS O(N+E), N — число вершин, E — число связей. HA>>>E может быть от 0 до O(N^2) HA>>>То есть какие-то патологические ситуации все-таки возможны.
G>>Еще раз. Все вершины проходятся максимум один раз. G>>Количество связей значение не имеет.
E>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся
Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, TimurSPB, Вы писали:
TSP>> В общем пока все возятся со всякими Java/C#/C++, в мире Дельфи уже наступило светлое будущее (пока 32-х битное правда)!
H>Йоу! Последние сводки с фронта: H>
Milestone: 64bit compiler now merged into the main dev branch! All devs are now locked and loaded!
Здравствуйте, hattab, Вы писали:
НС>> В случае шарпа примерно в 100% случаев.
H>Не вызовы MoveNext(), а непосредственно сам метод.
Всегда. Что бы было понятно
public Item GetNextItem()
{
return new Item();
}
Как ты думаешь, что это такое ? В дотнет это почти последовательность — если вызвать n-раз. Что бы стало по настоящему последовательностью, нужно заставить компилятор генерировать чуток кода:
public IEnumarable<Item> GetNextItem()
{
while(true)
{
yeild return new Item();
}
}
Если хочешь узнать, как это работает, нужно запустить ну хотя бы тот же reflector. Если коротко, то будет сгенерирован класс, который реализует IEnumarable, код выше реально будет заменен на примерно следующий
class GetNextItemEnumerator : IEnumerable<Item>,...
{
Item current = null;
public bool MoveNext()
{
this.current = new Item();
return true;
}
public Item Current
{
get
{
return this.current;
}
}
...
}
Все просто и никаких "структур" не надо.
foreach(Item item in GetNextItem())
{
// бесконечный цикл создания объектов
// со "структурами" на это памяти не хватит
}
Можно идти и дальше — обход любой сложной структуры вроде дерева, кольца, графа или генерация сложной последовательности делается довольно просто. А вот в Дельфи с итераторами придется попотеть.
Материал из Википедии — свободной энциклопедии, -_*
-_*> H>Не вызовы MoveNext(), а непосредственно сам метод.
-_*> Всегда. Что бы было понятно
-_*>
-_*> public Item GetNextItem()
-_*> {
-_*> return new Item();
-_*> }
-_*>
-_*> Как ты думаешь, что это такое ? В дотнет это почти последовательность — если вызвать n-раз. Что бы стало по настоящему последовательностью, нужно заставить компилятор генерировать чуток кода:
-_*>
-_*> public IEnumarable<Item> GetNextItem()
-_*> {
-_*> while(true)
-_*> {
-_*> yeild return new Item();
-_*> }
-_*> }
-_*>
-_*> Если хочешь узнать, как это работает, нужно запустить ну хотя бы тот же reflector. Если коротко, то будет сгенерирован класс, который реализует IEnumarable, код выше реально будет заменен на примерно следующий
-_*>
-_*> class GetNextItemEnumerator : IEnumerable<Item>,...
-_*> {
-_*> Item current = null;
-_*> public bool MoveNext()
-_*> {
-_*> this.current = new Item();
-_*> return true;
-_*> }
-_*> public Item Current
-_*> {
-_*> get
-_*> {
-_*> return this.current;
-_*> }
-_*> }
-_*> ...
-_*> }
-_*>
-_*> Все просто и никаких "структур" не надо.
Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?
-_*>
-_*> foreach(Item item in GetNextItem())
-_*> {
-_*> // бесконечный цикл создания объектов
-_*> // со "структурами" на это памяти не хватит
-_*> }
-_*>
-_*> Можно идти и дальше — обход любой сложной структуры вроде дерева, кольца, графа или генерация сложной последовательности делается довольно просто.
Хм, что же в таком случае заставляет разработчиков самостоятельно писать перечислители?
"Кусок кода"
namespace CookComputing.XmlRpc
{
public class XmlRpcStruct : Hashtable
{
private ArrayList _keys = new ArrayList();
private ArrayList _values = new ArrayList();
public override void Add(object key, object value)
{
if (!(key is string))
{
throw new ArgumentException("XmlRpcStruct key must be a string.");
}
if (XmlRpcServiceInfo.GetXmlRpcType(value.GetType())
== XmlRpcType.tInvalid)
{
throw new ArgumentException(String.Format(
"Type {0} cannot be mapped to an XML-RPC type", value.GetType()));
}
base.Add(key, value);
_keys.Add(key);
_values.Add(value);
}
public override object this[object key]
{
get
{
return base[key];
}
set
{
if (!(key is string))
{
throw new ArgumentException("XmlRpcStruct key must be a string.");
}
if (XmlRpcServiceInfo.GetXmlRpcType(value.GetType())
== XmlRpcType.tInvalid)
{
throw new ArgumentException(String.Format(
"Type {0} cannot be mapped to an XML-RPC type", value.GetType()));
}
base[key] = value;
_keys.Add(key);
_values.Add(value);
}
}
public override bool Equals(Object obj)
{
if (obj.GetType() != typeof(XmlRpcStruct))
return false;
XmlRpcStruct xmlRpcStruct = (XmlRpcStruct)obj;
if (this.Keys.Count != xmlRpcStruct.Count)
return false;
foreach (String key in this.Keys)
{
if (!xmlRpcStruct.ContainsKey(key))
return false;
if (!this[key].Equals(xmlRpcStruct[key]))
return false;
}
return true;
}
public override int GetHashCode()
{
int hash = 0;
foreach (object obj in Values)
{
hash ^= obj.GetHashCode();
}
return hash;
}
public override void Clear()
{
base.Clear();
_keys.Clear();
_values.Clear();
}
public new IDictionaryEnumerator GetEnumerator()
{
return new XmlRpcStruct.Enumerator(_keys, _values);
}
public override ICollection Keys
{
get
{
return _keys;
}
}
public override void Remove(object key)
{
base.Remove(key);
int idx = _keys.IndexOf(key);
if (idx >= 0)
{
_keys.RemoveAt(idx);
_values.RemoveAt(idx);
}
}
public override ICollection Values
{
get
{
return _values;
}
}
private class Enumerator : IDictionaryEnumerator
{
private ArrayList _keys;
private ArrayList _values;
private int _index;
public Enumerator(ArrayList keys, ArrayList values)
{
_keys = keys;
_values = values;
_index = -1;
}
public void Reset()
{
_index = -1;
}
public object Current
{
get
{
CheckIndex();
return new DictionaryEntry(_keys[_index], _values[_index]);
}
}
public bool MoveNext()
{
_index++;
if (_index >= _keys.Count)
return false;
else
return true;
}
public DictionaryEntry Entry
{
get
{
CheckIndex();
return new DictionaryEntry(_keys[_index], _values[_index]);
}
}
public object Key
{
get
{
CheckIndex();
return _keys[_index];
}
}
public object Value
{
get
{
CheckIndex();
return _values[_index];
}
}
private void CheckIndex()
{
if (_index < 0 || _index >= _keys.Count)
throw new InvalidOperationException(
"Enumeration has either not started or has already finished.");
}
}
}
}
-_*> А вот в Дельфи с итераторами придется попотеть.
Здравствуйте, hattab, Вы писали:
H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?
Ну покажи полный аналог для такого
Здравствуйте, gandjustas, Вы писали:
g> H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?
g> Ну покажи полный аналог для такого
-_*>Здравствуйте, enji, Вы писали:
E>>И в чем проблема? Ловим событие мыши, кидаем в очередь, зовем функцию сверки с образцом или серию таких функций. Совпало с чем-то — удаляем совпадение, делаем действие по данному совпадению, продолжаем. Не совпало ни с чем — продолжаем ловить. Не подходит ни под оидн образец — удаляем первый элемент, повторяем проверку.
-_*>Это устаревший, низкоуровневый подход. Можно вот так
Что ты говоришь И что в нем такого устаревшего?
ну и что? После того, как я оформлю свой подход в либу, для пользователя он будет выглядеть не сильно страшнее твоего кода
-_*>Серия эвентов преобразуется в последовательность координат. Это + еще кое что есть распознавание мышиных жестов. В нативном подходе, с очередями, совпадениями, надо было писать килобайты ифов, свичей, обработчиков и трястись над различными флагами.
Распознавание мышиных жестов в дельфях из коробки. Килобайтов ифов там нет...
Здравствуйте, gandjustas, Вы писали:
G>>>Количество связей значение не имеет.
E>>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся G>Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим
Ну т.е. кол-во связей значение таки имеет
На самом деле может быть даже больше N^2
class A;
class B
{
public A a1, a2, a3, a4, a5;
};
A a = new A;
B b = new B;
b.a1 = a; b.a2 = a; ...
Здравствуйте, enji, Вы писали:
E>На самом деле может быть даже больше N^2
число ребер в полном графе N(N-1)/2 — легко проверить.
Осталось уточнить — что фреймворк считает за связи.
Например, сколько связей для главного окна, элемента дерева или для переменной в рекурсивной процедуре.
Не может ли в каких-то ситуациях число связей расти сильнее O(N).
-_*>Серия эвентов преобразуется в последовательность координат. Это + еще кое что есть распознавание мышиных жестов.
скорее так: это + ЕЩЕ ДОФИГА ЧЕГО
В распознавании мышиных жестов самое интересное — не запись событий мыши и преобразования в посл координат (что тривиально), а алгоритмы распознавания; которые, как я сильно подозреваю, мало зависят от языка программирования
Здравствуйте, Head Ache, Вы писали:
HA>число ребер в полном графе N(N-1)/2 — легко проверить.
HA>Осталось уточнить — что фреймворк считает за связи. HA>Например, сколько связей для главного окна, элемента дерева или для переменной в рекурсивной процедуре. HA>Не может ли в каких-то ситуациях число связей расти сильнее O(N).
И что считает за вершины. В моем примере 2 объекта и 5 ссылок.
Если вершина — это объект, а ребро — это ссылка, то получается что не N(N-1)/2
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
g>> H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?
g>> Ну покажи полный аналог для такого
Здравствуйте, enji, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>>>Количество связей значение не имеет.
E>>>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся G>>Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим
E>Ну т.е. кол-во связей значение таки имеет
Количество вершин и ребер — связанные величины, причем одного порядка в реальных случаях. Как хочешь, так и считай.
Здравствуйте, enji, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>>>Количество связей значение не имеет.
E>>>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся G>>Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим
E>Ну т.е. кол-во связей значение таки имеет
E>На самом деле может быть даже больше N^2
Если в коде такое количество связей, и объекты друг на друга ссылаются, то проблема со скоростью GC уходит даже не на второй план, а сильно дальше, потому как самая главная проблема в днк писавшего такой код.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, gandjustas, Вы писали:
g> g>> H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?
g> g>> Ну покажи полный аналог для такого
например.
g> H>Т.е. ты мне на полном серьезе предлагаешь тут реализовать собственный Rx? Шутник, однако.
g> Нет, конкретный пример повтори с итератором, можно без асинхронности.
Если я правильно понял, это чтение из потока.
...
TEnumerator = Record
Strict Private
FStream : TStream;
FBuffer : TBytes;
Public
Procedure Init(AStream : TStream; ABufferSize : Integer);
Function MoveNext : Boolean;
Function GetCurrent : TBytes;
End;
...
Procedure TEnumerator.Init(AStream : TStream; ABufferSize : Integer);
Begin
FStream := AStream;
SetLength(FBuffer, ABufferSize);
End;
Function TEnumerator.MoveNext : Boolean;
Var
Count : Integer;
Begin
Count := FStream.Read(Pointer(FBuffer)^, Length(FBuffer));
If Count <> Length(FBuffer) Then
SetLength(FBuffer, Count);
Result := Count > 0;
End;
Function TEnumerator.GetCurrent : TBytes;
Begin
Result := FBuffer;
End;