Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самый быстрый способ сортировки строк 
:(
    Опции темы
zim22
Дата 2.7.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Riddik @  2.7.2009,  17:21 Найти цитируемый пост)
Скажите, как правильно передать параметры ф-ии qsort в этом случае

Код

int string_compare( const void *arg1, const void *arg2 )
{
  if (**(string**)arg1 < **(string**)arg2) return -1;
  if (**(string**)arg2 < **(string**)arg1) return 1;
  return 0;
}

std::string str0("hello");
std::string str1("my");
std::string str2("dear");
std::string str3("friend");

string *pstr[4];
pstr[0] = &str0;
pstr[1] = &str1;
pstr[2] = &str2;
pstr[3] = &str3;

qsort(pstr, 4, sizeof(string*), string_compare);



--------------------
PM MAIL   Вверх
Riddik
Дата 2.7.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zim22, благодарю smile
PM MAIL   Вверх
mes
Дата 3.7.2009, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



...

Это сообщение отредактировал(а) mes - 3.7.2009, 00:31


--------------------
PM MAIL WWW   Вверх
Riddik
Дата 3.7.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kamre на С++ сделал за 0.312 сек и попал в лучшую тридцатку! smile 

Это сообщение отредактировал(а) Riddik - 3.7.2009, 12:12
PM MAIL   Вверх
zim22
Дата 3.7.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Riddik @  3.7.2009,  12:11 Найти цитируемый пост)
kamre на С++ сделал за 0.312 сек 

интересно, какие оптимизации были применены...


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


Опытный
**


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

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



Цитата(Riddik @ 3.7.2009,  12:11)
kamre на С++ сделал за 0.312 сек

Еще раз переписал без использования std::set, вот такой код получился:
Код
#include <map>
#include <vector>
#include <string>

#include <algorithm>
#include <iterator>

#include <sstream>
#include <iostream>

using namespace std;

void readAssociations(map<string, vector<int> > & item_associations,
                      vector<string> & all_associations)
{
  int items_count;
  cin >> items_count;
  cin.ignore();

  string line;
  string name;
  string association;
  istringstream iss;
  map<string, int> association_index;

  while (items_count--) {
    getline(cin, name, ':');
    getline(cin, line);
    iss.str(line);
    vector<int> & associations = item_associations[name];
    while (iss >> association) {
      map<string, int>::iterator iter = association_index.find(association);
      if (iter != association_index.end()) {
        associations.push_back(iter->second);
      } else {
        int index = all_associations.size();
        association_index[association] = index;
        associations.push_back(index);
        all_associations.push_back(association);
      }
    }
    iss.clear();
  }
}

struct compare {
  const vector<string> & _vect;

  compare(const vector<string> & vect) : _vect(vect) {}

  bool operator () (int idx0, int idx1) {
    return _vect[idx0] < _vect[idx1];
  }
};

void sortAssociations(map<string, vector<int> > & item_associations, 
                      const vector<string> & all_associations,
                      vector<int> & to_sorted)
{
  // to_sorted maps indexes to indexes in sorted vector of associations
  size_t sz = all_associations.size();
  to_sorted.resize(sz);
  // initialize with identity
  for (size_t i = 0; i < sz; ++i) {
    to_sorted[i] = i;
  }
  // create mapping
  sort(to_sorted.begin(), to_sorted.end(), compare(all_associations));
  // from_sorted is inverse of mapping to_sorted
  vector<int> from_sorted(sz);
  for (size_t i = 0; i < sz; ++i) {
    from_sorted[to_sorted[i]] = i;
  }
  // apply from_sorted mapping to associations indexes for all items
  // and sort associations indexes
  map<string, vector<int> >::iterator iter;
  for (iter = item_associations.begin(); iter != item_associations.end(); ++iter) {
    vector<int> & associations = iter->second;
    for (size_t i = 0; i < associations.size(); ++i) {
      associations[i] = from_sorted[associations[i]];      
    }
    sort(associations.begin(), associations.end());
  }
}

void processQuery(const vector<string> & query,
                  const map<string, vector<int> > & item_associations,
                  const vector<string> & all_associations,
                  const vector<int> & to_sorted)
{
  vector<string>::const_iterator name_it = query.begin();
  const vector<int> & associations = item_associations.find(*name_it)->second;

  vector<int> common(associations.size());
  copy(associations.begin(), associations.end(), common.begin());

  while (++name_it != query.end()) {
    const vector<int> & associations = item_associations.find(*name_it)->second;
    vector<int>::iterator end;
    end = set_intersection(common.begin(),
      common.end(),
      associations.begin(),
      associations.end(),
      common.begin());
    if (end != common.end())
      common.erase(end, common.end());
    if (common.empty())
      break;
  }

  if (common.empty()) {
    cout << "No solution.\n";
  } else {
    vector<int>::const_iterator iter = common.begin();
    cout << all_associations[to_sorted[*iter++]];
    while (iter != common.end()) {
      cout << ' ' << all_associations[to_sorted[*iter++]];
    }
    cout << '\n';
  }
}

void processQueries(const map<string, vector<int> > & item_associations,
                    const vector<string> & all_associations,
                    const vector<int> & to_sorted)
{
  int queries_count;
  cin >> queries_count;
  cin.ignore();

  string line;
  string name;
  istringstream iss;
  vector<string> query;

  while (queries_count--) {
    query.clear();
    getline(cin, line);
    iss.str(line);
    while (iss >> name)
      query.push_back(name);
    iss.clear();
    processQuery(query, item_associations, all_associations, to_sorted);
  }
}

int main()
{
#ifndef ONLINE_JUDGE
  freopen("input.txt", "rt", stdin);
#endif  
  map<string, vector<int> > item_associations;
  vector<string> all_associations;
  vector<int> to_sorted;
  readAssociations(item_associations, all_associations);
  sortAssociations(item_associations, all_associations, to_sorted);
  processQueries(item_associations, all_associations, to_sorted);
  return 0;
}


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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