2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 16:22 
Аватара пользователя


05/08/11
36
Калининград
svv в сообщении #1100399 писал(а):
Если такое подойдёт, могу подумать в этом направлении.


Конечно! Подойдут любые идеи.

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 19:21 
Заслуженный участник


10/01/16
2318
Alex Fox
это количество числе в таблице?
Ну - да, я имел ввиду количество строк.

1.Ваша задача еще напоминает классическую комбинаторную:"сколько маршрутов кратчайшей длины идет из левого нижнего угла шахматной доски в правый верхний угол?" (идем по соседним по стороне клеткам). Ответ - такой же: $C^7_{7+7}$. Потому что маршрут кодируется буквами П (вправо) и В (вверх). У Вас - то же самое: если в начале каждой строки приписать -чисто для кайфа - 0, а в конце - $m$, то символы в строке будут меняться в точности от 0 до $m$, и соответствующий маршрут на карте выглядит так: шагаем вверх (В) столько раз, на сколько отличаются символы в соседних местах вашей строки, ставим П, и т.д. Например, для строки 023 код будет такой : ПВВПВП... Опять же, эта кодировка делается совсем понятной, если вспомнить про метод "шары-перегородки" для задачи о сочетаниях с повторениями; П - это перегородки, ВВ..В - сколько шаров в соответствующем ящике. Может, эта геометрическая (или комбинаторная ))интерпретация будет вам полезна.
2. Вообше то в вашей постановке задачи , используется лексикографический порядок (а способ нумерации, предложенный svv - универсальный способ составления словаря челом, который не хочет заранее ограничивать себя количеством используемых букв ). Эта тематика - составление словарей и разработка прямого доступа к ним - наверняка классиками-программистами изучалась...
3. Аварийное завершение может происходить из-за факториалов больших чисел. Так не считайте биноминальные к-ты по этим формулам, а используйте рекуррентные (соседние бин.к-ты связаны совсем просто - получаются друг из друга домножением/делением на пару чисел) - тем более, что вам все равно нужно будет их отслеживать.

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 19:37 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
Простите, во всех своих сообщениях выше я перепутал $m$ и $n$. Теперь постараюсь писать правильно.

Вот программка, которая выводит таблицу для заданных $m$ и $n$. Это консольное приложение на C++.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
//------------------------------------
#include <stdio.h>
#include <conio.h>
//------------------------------------
int fact(int n)
{
   int p=1;
   for (int i=1; i<=n; ++i)
      p*=i;
   return p;
}
//------------------------------------
int bin(int n, int k)
{
   if (k>n) return 0;
   return fact(n)/(fact(k)*fact(n-k));
}
//------------------------------------
int R(int i, int n)
{
   for (int l=0; ; ++l)
      if (bin(l+n, n)>=i) return l;
}
//------------------------------------
void GetRow(int i, int *d, int n)
{
   for (int j=n-1; j>=0; --j)
   {
      d[j]=R(i, j+1);
      i-=bin(d[j]+j, j+1);
   }
}
//------------------------------------
void main()
{
   const int
      n=4,
      m=4,
      imax=bin(n+m, n);

   for (int i=1; i<=imax; ++i)
   {
      int d[n];

      GetRow(i, d, n);
      for (int j=0; j<n; ++j)
         printf("%2d", d[j]);

      printf("\n");
   }
   getch();
}
//------------------------------------
 

Таблица выводится в моём порядке. Чтобы выводилась в Вашем, надо три оператора в основном цикле функции main (Вы увидите, какие) заменить на
Используется синтаксис C++
      GetRow(imax-i+1, d, n);
      for (int j=0; j<n; ++j)
         printf("%2d", m-d[n-1-j]);
Изменение сведётся к обращению порядка столбцов, строк и замены каждого числа $d$ на $m-d$.

Программа выводит таблицу построчно, но каждая строка вычисляется независимо от остальных, исходя только из её номера (ну, и констант $m, n$), в этом «честность» программы. Вкратце о том, что делает каждая функция.
fact(n) вычисляет $n!$
bin(n, k) вычисляет $C_n^k$
R(i, n), самая страшная функция. Для данных $i, n$ находит минимальное целое положительное $\ell$, такое, что $C_{n+\ell}^n\geqslant i$.
GetRow(i, d, n) вычисляет для данного номера строки $i$ все её элементы $d_{ij}$, где $j=0..n-1$
Аргументы функций предполагаются целыми неотрицательными.
Если Вы замените реализации функций более эффективными, я буду только рад.

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 20:47 
Аватара пользователя


05/08/11
36
Калининград
Код:
#include<iostream>
using namespace std;

int fact(int x)
{
    int m=1;
    for(int i(1); i <= x; i++)
{
    m *= i;
}
    return m;
}
int C(int x, int y)
{
    int z = fact(x+y)/(fact(x)*fact(y));
    return z;
}
int main()
{
    setlocale(LC_ALL, "Rus");
    int n, m, rowNumber, columnNumber;
    cout << "Введите число cтолбцов:\t\t";
    cin >> n;
    cout << "Введите количество значений:\t";
    cin >> m;
    cout << "Укажите строку:\t\t\t";
    cin >> rowNumber;
    cout << "Укажите столбец:\t\t";
    cin >> columnNumber;
    int k=0;

    for(;;)
    {
        if(rowNumber<=C(n-1,m))
        {
            cout << k;
            n--;
        }
        else if(rowNumber>C(n-1,m))
        {
           rowNumber -=C (n-1,m);
           k++;
           m--;
           continue;
        }
        if(n==0)
            break;
    }
    return 0;
}



Вот мой код, сразу скажу, что я не программист, поэтому это далеко не самая эффективная реализация алгоритма. Проверял его для некоторых, небольших, частных значений. Как верно заметил DeBill краши вероятнее всего из-за биномиальных коэфф-в.

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 21:28 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
Ваша программа красивая и многообещающая, но у меня она пока не заработала. Я переписал её так, чтобы она выдавала всю таблицу для заданных $m, n$. Сейчас в каждой строке повторяется одно и то же число. Это потому, что в Вашем алгоритме пока что никак не используется columnNumber. Что надо исправить?

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 22:24 
Аватара пользователя


05/08/11
36
Калининград
svv в сообщении #1100495 писал(а):
Ваша программа красивая и многообещающая, но у меня она пока не заработала.

:mrgreen:

Странно, у меня работает. columnNumber действительно никак не используется, я планировал потом дописать программу, чтобы на экран вместо всей строки выводился искомый элемент, тут то и понадобилась бы эта переменная, но поскольку программа падает если выставлять значения переменных больше 20, то я не стал замарачиваться.
UPD: Возможно у вас не работает из-за метода setlocale

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение18.02.2016, 22:42 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
Ура, всё заработало!

 Профиль  
                  
 
 Re: Поиск элемента по номеру строки и столбца
Сообщение19.02.2016, 07:30 
Заслуженный участник


27/04/09
28128
Честно говоря, стоило бы переписать функцию, выдающую $C_n^m$. Она ведь могла бы выдавать правильные значения намного чаще, если реализовать её как $\prod_{i = 1}^{m_1} (m_2 + i)/i$; $m_1 = \min\{m,n-m\}$, $m_2 = \max\{m,n-m\}$.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: confabulez


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group