Применима ли венгерская нотация к Perl? [закрыто]

Возможно, я слишком поздно внес что-либо полезное, но вот простой, короткий и очень эффективный фрагмент:

def choose_index(probabilies):
    cmf = probabilies[0]
    choice = random.random()
    for k in xrange(len(probabilies)):
        if choice <= cmf:
            return k
        else:
            cmf += probabilies[k+1]

Не нужно сортировать свои вероятности или создавать вектор с вашим cmf, и он прекращается, как только он находит свой выбор. Память: O (1), время: O (N), со средним временем работы ~ N / 2.

Если у вас есть веса, просто добавьте одну строку:

def choose_index(weights):
    probabilities = weights / sum(weights)
    cmf = probabilies[0]
    choice = random.random()
    for k in xrange(len(probabilies)):
        if choice <= cmf:
            return k
        else:
            cmf += probabilies[k+1]
13
задан Eugene Yarmash 27 January 2010 в 20:10
поделиться

5 ответов

Лично мне трудно читать венгерские обозначения. Я просто использую английские соглашения:

my $values; # is an array
my $value;  # is a scalar
my $value_hash; # is a hash

Я обычно отношусь к объектам так же, как к скалярам, ​​потому что их использование делает достаточно очевидным, что это объект. Однако, если мне когда-нибудь понадобится, я использую:

my $value_obj;  # is an object
16
ответ дан 1 December 2019 в 17:31
поделиться

Мех. ArrayRefs и Hashrefs и тому подобное не в конечном итоге сбивают с толку здесь, что вопрос подходит для наших типов данных Perl очень часто. (Также: $ OVALUE ? Как вы можете быть? В каком его объекте это?)

Вместо этого дайте мне семантические единицы венгерские обозначения: $ size_bits , $ size_bytes , , $ size_kb , $ size_blocks , $ size_mb , $ size_gb . Основной тип данных? Не так важно, как добавление 3 байта до 10 мегабайт в секунду и получение 13. , что - это то, где является венгерская обозначение какой-то формы.

18
ответ дан 1 December 2019 в 17:31
поделиться

Если вам нужны языки со статическим набором, вы знаете, где их найти...

Но венгерская нотация никогда не предназначалась для технических типов данных (хотя она заработала большую часть своего плохого ответа, будучи неправильно понятой и -применимой для технических типов данных). Венгерский разработчик (Charles Simonyi) предполагал, что она будет передавать семантическую информацию, например, используя row и col префиксы в коде, который работает с таблицами, чтобы не смешивать индексы строк и столбцов.

10
ответ дан 1 December 2019 в 17:31
поделиться

Я не делаю этого, потому что использование ссылки сделает ясно своими. Например:

$a->{key};  # hash
... if @$b; # array
$c->foo;    # object

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

4
ответ дан 1 December 2019 в 17:31
поделиться

Я не уверен, что я правильно понимаю, в том, что вы сказали «, где« файл »- это дескриптор файла, ранее установленный функцией, такой как MMAP. Этот вызов читает 500 байтов по индексу 100. «Это звучит подозрительно, как поиск компенсации и прочитал 500 байтов ... но вы хотите, чтобы это было предварительно выбрано ...

в C-коде, это будет выглядеть что-то подобное:

fseek(fp, 100, SEEK_CUR);
fread(&data, 500, 1, fp);

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

Если честно, я не сталкивался с такой вещью, который делает предварительные данные ... но ответом Рэя удивил меня, но затем снова это только для Vista вверх, если вы хотите сохранить совместимость ... Это что-то, чтобы сохранить В виду ... но ссылки ниже могут помочь ...

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

Надежда это помогает, С наилучшими пожеланиями, Том.

-121--2415544-

Цель венгерской обороты - вставлять семантические аннотации, которые

  • в противном случае не могут быть выражены на языке, особенно система типа и
  • не очевидно из контекста

в имена переменных. Теперь, поскольку Perl не имеет системной системы статического типа, может показаться, что венгерская обозначение должна быть довольно распространена. Но возьмите канонический пример для ценности венгерской обозначения: отслеживание происхождения ненадежных данных.

Одним из употреблений OFT-приведенных примеров для венгерского языка является префиксом всех строковых переменных в приложении либо S , либо U (для в безопасности и Небезопасное ), в зависимости от того, появилась ли строка из доверенного источника (или была дезинфицирована) или ненадежным. Но: просто заменить небезопасных с Tainted , и у вас есть идеальное описание испортить в Perl. Таким образом, в этом случае, хотя Perl не имеет системной системы статического типа, она имеет динамическую систему , которая позволяет выразить семантику доверие / ненадежную на языке, и, таким образом, венгерская нотация Отказ (И даже на языке без встроенной поддержки запятнать, есть обычно гораздо лучшие способы, такие как подтипинг (Python, Ruby, SmallTalk, ...), Аннотации / Атрибуты (Java, C #, ...), Метаданные (Clojure, ...) и статический набрав (haskell, ml, ...).)

Кроме того, Perl довольно Darn выразительно, и, таким образом, намного проще держать весь контекст для переменной в вашей голове ( Или в течение одного скважины кода), поэтому часто достаточно семантика очевидно из окружающего кода.

Хорошее название также помогает, конечно.

Помните: венгерская нотация была изобретена для C, которая не выразительна и имеет систему статического типа, чья в значительной степени используется только как изящная шутка.

6
ответ дан 1 December 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: