次のようなレコードを含む .dat ファイルがある場合:
805816899 Andrew
803975268 Bob
912684297 Jeff
123546789 Louis
751354687 Kevin
リストを ID 番号でソートしてから画面に書き込むために使用する最も簡単なデータ構造は何ですか? BST が最も理にかなっており、最も効率的であると考えていますが、このような小さなファイルを扱う場合は、スタックの方が簡単で高速です。
また、どのように実装しますか?
次のようなレコードを含む .dat ファイルがある場合:
805816899 Andrew
803975268 Bob
912684297 Jeff
123546789 Louis
751354687 Kevin
リストを ID 番号でソートしてから画面に書き込むために使用する最も簡単なデータ構造は何ですか? BST が最も理にかなっており、最も効率的であると考えていますが、このような小さなファイルを扱う場合は、スタックの方が簡単で高速です。
また、どのように実装しますか?
最も簡単なのは、BST を使用してそれらをソートすることでしたstd::map<int, std::string>
。これは、内部で BST を使用して自己ソートされたデータ構造です (ただし、標準では明示的に指定されていません)。ルックアップが必要ない場合は、std::set
代わりにユーザー定義型の を使用できます (次の段落を参照)。
それらをフラットな配列のような構造に格納する場合は、小さな構造体を作成して情報を保持し、そのインスタンスを に格納しstd::vector
、適切な比較関数を と組み合わせて使用std::sort
して並べ替えを行うことができます。
基地局:
#include <string>
#include <map>
std::map<int, std::string> m;
m[805816899] = "Andrew";
m[803975268] = "Bob";
等々。
配列のようなソリューション:
struct Foo
{
Foo(int ID, const std::string& name) : ID(ID), name(name) {}
int ID;
std::string name;
};
// comparison for sorting
bool comp(const Foo& lhs, const Foo& rhs) { return lhs.ID < rhs.ID; }
#include <vector>
#include <algorithm>
....
std::vector<Foo> v;
v.push_back(Foo(805816899, "Andrew"));
v.push_back(Foo(803975268, "Bob"));
// add more entries
std::sort(v.begin(), v.end(), comp);
トライはソート全体を実装する最も簡単な方法であり、IDの長さが一定の場合はO(n)だと思います。
#include <iostream>
#include <cassert>
#include <string>
class node {
bool final;
union {
node *next[10];
char *name;
};
node *get_at(int index)
{
assert(!final);
return next[index] ? next[index] : (next[index] = new node);
}
public:
node() : final(false) { std::fill(next, next+10, (node*)0); }
~node() {
if (final)
delete name;
else
for (int i=0; i<10; ++i)
delete next[i];
}
void insert(const char *id, std::string const& s)
{
if (*id) {
get_at(*id - '0')->insert(id+1, s);
} else {
final=true;
name = new char[s.size()+1]();
std::copy(s.begin(), s.end(), name);
}
}
void print_all(std::ostream& os) const
{
if (final)
os << name << '\n';
else
for (int i = 0; i < 10; ++i)
if (next[i])
next[i]->print_all(os);
}
};
int main()
{
node top;
for (std::string id, name; std::cin >> id >> name;)
top.insert(id.c_str(), name);
top.print_all(std::cout);
}