タグ付けされた質問 「algorithm」

アルゴリズムは、問題に対する抽象的な解決策を定義する明確に定義された一連のステップです。このタグは、問題がアルゴリズム設計に関連している場合に使用します。

3
整数Nが指定されています。数字が0または1のみであるNより大きい最小の整数は何ですか?
私は整数Nを持っています。0または1以外の数字を含まない、Nより大きい最小の整数を見つける必要があります。例:N = 12次に、答えは100です。私はC ++でブルートフォースアプローチをコーディングしました。 int main() { long long n; cin >> n; for (long long i = n + 1; ; i++) { long long temp = i; bool ok = true; while (temp != 0) { if ( (temp % 10) != 0 && (temp % 10) != …
15 c++  algorithm 

5
特定の合計または平均を持つ範囲でN個のランダムな整数を生成する効率的な方法はありますか?
N個の整数のランダムな組み合わせを生成する効率的な方法はありますか? 各整数は区間[ min、max]にあり、 整数の合計はsum、 整数は任意の順序(たとえば、ランダムな順序)で表示できます。 組み合わせは、他の要件を満たすすべての組み合わせの中からランダムに均一に選択されていますか? ランダムな組み合わせに対して同様のアルゴリズムがあり、整数は値によってソートされた順序で(順序ではなく)表示される必要がありますか? (平均の適切な組み合わせを選択することmeanは特殊なケースですsum = N * mean。の場合。この問題はsum、間隔[ min、max]にあり、任意の順序または並べ替えられた順序で表示されるN個の部分に均一なランダムパーティションを生成するのと同じです。場合によっては値)。 この問題は、ランダムな順序で現れる組み合わせに対して次の方法で解決できることを認識しています(編集[4月27日]:アルゴリズムが変更されました)。 N * max < sumまたはの場合N * min > sum、解決策はありません。 の場合N * max == sum、すべてのN数値がに等しいソリューションが1つだけ存在しmaxます。の場合N * min == sum、すべてのN数値がに等しいソリューションが1つだけ存在しminます。 SmithとTrombleで指定されたアルゴリズム(「単位シンプレックスからのサンプリング」、2004)を使用して、合計でN個のランダムな非負の整数を生成しsum - N * minます。 minこの方法で生成された各数値に追加します。 いずれかの数値がより大きい場合はmax、手順3に進みます。 ただし、maxがより小さい場合、このアルゴリズムは遅くなりsumます。たとえば、私のテストによれば(上記の特殊なケースの実装を伴うmean)、アルゴリズムは平均して拒否します— の場合N = 7, min = 3, max = 10, sum …

3
200000以上の要素を含む2つの配列要素の最小積を見つける最速の方法
アレイがありa[n]ます。番号nは当社が入力します。私は、最小限の製品を見つける必要があるa[i]とa[j]場合を: 1) abs(i - j) > k 2)a[i] * a[j]最小化されている これが私の解決策です(非常に素朴です): #include <iostream> using namespace std; #define ll long long int main() { ll n,k; cin >> n >> k; ll a[n]; for(ll i=0;i<n;i++) cin >> a[i]; ll mn; bool first = true; for(ll i=0;i<n;i++) { for(ll j=0;j<n;j++) { if(i!=j) …

2
1つの制約が不足している制約充足問題
私は大学の研究室の実習チューターで、昨年の学生のコメントに基づいて、私たちの上司と私はそれらに対処したいと思っていました。私の上司はCスクリプトの記述を選択し、問題を解決するためにpython(python-constraint)を選択しました。 お知らせ 6つのセッションがあります 4つの役割があります 6つのプラクティスがあります 生徒は32人です チームごとに4人の学生がいます 問題点: 4つの異なるセッションの4つの練習で、各生徒を4つの役割に割り当てます。 制約: 学生は一度役割を果たすべきです 学生は6つのうち4つの異なる練習をする必要があります 学生はセッションごとに1つの練習のみを行う必要があります 学生は同じ仲間に一度だけ会うべきです テンプレート: これは私が学生に感じるテンプレートです。各チームは4人の学生で構成され、ポジション[0、1、2、または3]はそれらに割り当てられたロールです。使用可能な各位置には、1から128までの番号が付けられています [# Semester [ # Session [ # Practice/Team 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]], [[25, 26, …

3
アイテムをスタック内の位置に移動するための最小移動数を見つける方法は?
Nがスタックの数、Pがスタックの容量であるNXPスタックのセットが与えられた場合、ロケーションAのノードから任意のロケーションBに移動するために必要なスワップの最小数を計算するにはどうすればよいですか?私はゲームを設計しています。最終的な目標は、すべてのスタックをすべて同じ色になるように並べ替えることです。 # Let "-" represent blank spaces, and assume the stacks are stacks = [ ['R', 'R', 'R', 'R'], ['Y', 'Y', 'Y', 'Y'], ['G', 'G', 'G', 'G'], ['-', '-', '-', 'B'], ['-', 'B', 'B', 'B'] ] stacks[1][1]そんな時に「B」を挿入したい場合stacks[1] = ["-", "B", "Y", "Y"]。そのために必要な移動の最小数を決定するにはどうすればよいですか? 私は複数のアプローチを見てきました。ある状態から可能なすべての動きを生成し、それらにスコアを付け、次に最良のスコアリングパスを継続する遺伝的アルゴリズムを試しました。また、問題をパスファインディングするためにDjikstraのアルゴリズムを実行しようとしました。イライラするほどシンプルに見えますが、指数時間以外で実行する方法を理解できません。ここで適用できる欠落しているアルゴリズムはありますか? 編集する 必要な移動の最小数を計算するためにこの関数を書きました:スタック:スタック内のピースを表すキャラクターのリストのリスト、スタック[0] [0]はスタックのトップです[0]スタック_インデックス:インデックスピースを追加するスタックneeds_piece:スタックに追加するピースneeds_index:ピースを配置するインデックス def calculate_min_moves(stacks, stack_ind, needs_piece, …

7
リストの要素の公平な分割
プレイヤーの評価のリストを考えると、プレイヤー(つまり、評価)をできるだけ2つのグループに分割する必要があります。目標は、チームの累積評価の差を最小限に抑えることです。プレーヤーをチームに分割する方法に制約はありません(1つのチームには2人のプレーヤーがいて、もう1つのチームには10人のプレーヤーがいます)。 例:[5, 6, 2, 10, 2, 3, 4]返すべき([6, 5, 3, 2], [10, 4, 2]) この問題を解決するアルゴリズムを知りたいのですが。私はオンラインプログラミングの入門コースを受講しているので、簡単なアルゴリズムをいただければ幸いです。 次のコードを使用していますが、なんらかの理由で、オンラインコードチェッカーで間違っていると表示されています。 def partition(ratings): set1 = [] set2 =[] sum_1 = 0 sum_2 = 0 for n in sorted(ratings, reverse=True): if sum_1 < sum_2: set1.append(n) sum_1 = sum_1 + n else: set2.append(n) sum_2 = sum_2 + …
12 python  algorithm  list 

3
2つのシーケンスが与えられた場合、一方の終わりともう一方の始まりの間の最大の重なりを見つける
次の問題を解決するには、効率的な(疑似)コードを見つける必要があります。 (必ずしも明瞭ではない)整数の二つの配列を考慮する(a[1], a[2], ..., a[n])と(b[1], b[2], ..., b[n])、最大見つけるdようにa[n-d+1] == b[1]、a[n-d+2] == b[2]、...、とa[n] == b[d]。 これは宿題ではありません。実際には、できるだけ多くの次元で2つのテンソルを縮小しようとしたときにこれを思いつきました。効率的なアルゴリズムが存在するのではないO(n)かと思う(たぶん?)が、そうでないものは思いつきませんO(n^2)。O(n^2)アプローチは、上の明白なループになりd、その後、項目の内部ループは最大を打つまでに必要な条件をチェックしますd。しかし、私はこれより良い何かが可能であると思います。

1
等しい接頭辞と接尾辞を順次削除する効率的な文字列切り捨てアルゴリズム
テストあたりの制限時間:5秒 テストあたりのメモリ制限:512メガバイト s長さの文字列n(n≤5000)が与えられます。この文字列のサフィックスでもある適切なプレフィックスを選択し、選択したプレフィックスまたは対応するサフィックスを削除できます。次に、結果の文字列に同様の操作を適用できます。そのような操作の最適なシーケンスを適用した後に達成できる最終的な文字列の最小の長さはどれくらいですか? 入力 各テストの最初の行にsは、小さな英語の文字で構成される文字列が含まれています。 出力 単一の整数を出力します—そのような操作の最適なシーケンスを適用した後に達成できる最終的な文字列の最小の長さ。 例 +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | +-------+--------+----------------------------------+ | aabaa | 2 | aaba|a → a|aba → ab|a → ab | +-------+--------+----------------------------------+ | abc | …

1
キーによるImmutableSortedDictionary範囲列挙
私はC#のについて読んでいたImmutableSortedDictionary中でSystem.Collections.Immutable、私のプログラムでそれを適用する方法を考えます。私はC ++ lower_boundとupper_bound(ここを参照)をかなり気に入っており、範囲検索のようなものを見たいと思っていました。ただし、同様のメソッドがドキュメントに不思議に欠けているようです。何か不足していますか?または、MSはソートされた範囲への効率的なアクセスなしにソートされた辞書を本当に提供しますか?それはIEnumerable、拡張メソッドのように、キーに対して実行できることとまったく同じではないようです。そのため、コレクションから直接提供されるものを見ていません。

4
ストリートデータ(グラフ)での近隣(クリーク)の検索
都市の近隣をグラフ上のポリゴンとして自動的に定義する方法を探しています。 私の近所の定義には2つの部分があります。 ブロック:通り(エッジ)と交差点(ノード)の数が最低3(三角形)である、いくつかの通りの間で囲まれた領域。 近隣:特定のブロックについて、そのブロックに直接隣接するすべてのブロックとブロック自体。 例については、この図を参照してください。 たとえば、B4は7つのノードとそれらを接続する6つのエッジによって定義されるブロックです。ここでのほとんどの例と同様に、他のブロックは4つのノードとそれらを接続する4つのエッジによって定義されます。また、B1の近傍にはB2が含まれ(逆も同様)、B2にもB3が含まれます。ます。 OSMからストリートデータを取得するためにosmnxを使用しています。 osmnxとnetworkxを使用して、グラフを走査して各ブロックを定義するノードとエッジを見つけるにはどうすればよいですか? 各ブロックについて、隣接するブロックをどのように見つけることができますか? 私は、グラフと座標(緯度、経度)のペアを入力として受け取り、関連するブロックを識別して、そのブロックのポリゴンと上記で定義した近傍を返すコードに向けて取り組んでいます。 以下は、マップを作成するために使用されるコードです。 import osmnx as ox import networkx as nx import matplotlib.pyplot as plt G = ox.graph_from_address('Nørrebrogade 20, Copenhagen Municipality', network_type='all', distance=500) そして、ノードの数と次数が異なるクリークを見つけるための私の試み。 def plot_cliques(graph, number_of_nodes, degree): ug = ox.save_load.get_undirected(graph) cliques = nx.find_cliques(ug) cliques_nodes = [clq for clq in cliques if …

2
Excel / SharedStringsのソートアルゴリズム
Excelでは、数値マッピングに文字列を「圧縮」します(この場合、圧縮という単語が正しいかどうかはわかりません)。以下に例を示します。 これは全体的なファイルサイズとメモリフットプリントを削減するのに役立ちますが、Excelは文字列フィールドでどのように並べ替えを行うのですか?すべての単一の文字列はルックアップマッピングを通過する必要がありますか。そうであれば、文字列フィールドでのソートのコストが大幅に増加したり、速度が低下したりすることはありません(1Mの値があった場合、1Mのキールックアップは行われません)。ささいな)。これに関する2つの質問: 共有文字列はExcelアプリケーション自体の中で使用されていますか、それともデータを保存するときだけですか? では、フィールドで並べ替えるアルゴリズムの例は何でしょうか?どの言語でも問題ありません(c、c#、c ++、python)。

8
最も人口の多い年を見つける(最も効率的なソリューション)
2つの配列があるとします。$births誰かが生まれた時期を示す誕生年$deathsのリストと、誰かが死亡した時期を示す死年のリストが含まれている場合、人口が最も多かった年をどのように見つけることができますか? たとえば、次の配列があるとします。 $births = [1984, 1981, 1984, 1991, 1996]; $deaths = [1991, 1984]; 人口が最も多かった年はであるはずです1996。なぜなら3、その年の間に人々は生きていたからです。それは、それらの年の中で最も高い人口数でした。 これについて、実行中の数学は次のとおりです。 | 誕生| 死| 人口| | ------- | ------- | ------------ | | 1981 | | 1 | | 1984年 | 2 | | 1984年 1984年 2 | | 1991 | 1991 | 2 | | …

1
shift_right()はC ++ 20でどのように実装される予定ですか?
C ++ 20では、<algorithm>ヘッダは、2つの新しいアルゴリズムを獲得:shift_left()およびshift_right()。どちらもLegacyForwardIteratorを受け入れます。についてはshift_left()、「iから開始する順番で移動する」と明記されている​0。の場合shift_right()、「ForwardItLegacyBidirectionalIteratorの要件を満たしている場合、移動はi最初から降順で実行される」と指定されていますlast - first - n - 1。 私は実装するのにかなり簡単な方法を考えることができますshift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; } return …

4
リスト内のリストが同等であるかどうかを確認するより速い方法はありますか?
ここでは1:7、4つの異なるパーティション、つまり{1}、{2,3,4}、{5,6}、および{7}の整数があり、それらのパーティションはリストに書き込まれlist(1,c(2,3,4),c(5,6),7)ます。1つのパーティション内の要素の異なる順列が同じものとして認識されるように、パーティションをセットとして扱います。たとえば、list(1,c(2,3,4),c(5,6),7)とlist(7,1,c(2,3,4),c(6,5))同等です。 この問題はセット全体の排他的パーティションについて説明しているため、リスト内の要素(noなど)の繰り返しはありませんlist(c(1,2),c(2,1),c(1,2))。 以下のように、いくつかの異なる順列をリストにリストしlstました lst <- list(list(1,c(2,3,4),c(5,6),7), list(c(2,3,4),1,7,c(5,6)), list(1,c(2,3,4),7,c(6,5)), list(7,1,c(3,2,4),c(5,6))) そして、私がしたいことは、すべての順列が同等であることを確認することです。はいの場合、結果を取得しTRUEます。 私はこれまでやったことは、各パーティション内の要素をソートし、かつ使用することであるsetdiff()とinterset()し、union()それを判断する(下の私のコードを参照してください) s <- Map(function(v) Map(sort,v),lst) equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0 ただし、パーティションサイズが大きくなると、この方法は遅くなると思います。それを作るためのより速いアプローチはありますか?事前に感謝! 一部のテストケース(小さいサイズのデータ​​) # should return `TRUE` lst1 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,4),c(6,5))) # should return `TRUE` lst2 <- list(list(1:2, 3:4), list(3:4, 1:2)) # should return `FALSE` lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))

3
Haskellでのリストの三角形化
triangularize :: [a] -> [[a]](おそらく無限の)リストを取り、それをリストのリストに「三角形化」する効率的なHaskell関数を書くことに興味があります。たとえば、triangularize [1..19]返す必要があります [[1, 3, 6, 10, 15] ,[2, 5, 9, 14] ,[4, 8, 13, 19] ,[7, 12, 18] ,[11, 17] ,[16]] 効率的には、リストの長さがO(n)どこにあるのかを実行することを意味しnます。 リスト(配列)の末尾への追加は一定時間の操作であるため、これはPythonなどの言語で非常に簡単に実行できることに注意してください。これを実現する非常に命令的なPython関数は次のとおりです。 def triangularize(elements): row_index = 0 column_index = 0 diagonal_array = [] for a in elements: if row_index == len(diagonal_array): diagonal_array.append([a]) else: diagonal_array[row_index].append(a) if …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.