回答:
複雑さの計算を行う場合、通常はRAMモデルを使用します。このモデルでは、配列のインデックスがO(1)であると想定しています。代入文は、変数の配列 insに変数を代入するのと同じです。これは便宜上のものです。アルゴリズムの分析を簡素化します。現実の世界では、配列のインデックス付けには(log I)が必要です。ここで、Iはインデックス付けされるものの数です。
通常、ループなど、入力のサイズに依存するものを考慮します。ループ内にO(1)演算があり、それがn回実行される場合でも、アルゴリズムはO(n)時間実行されます。
しかし、ループの外のO(1)操作は一定の時間のみを必要とし、O(n)+ O(1)= O(n)です。
CLRSから基数ソートアルゴリズムについて読んでください。
最終的な目標は、「秒単位の実行時間」、またはより一般的には(最新のCPU機能を無視して)「クロックサイクル数」です。結局のところ、これは分析するのが難しく、また、マシンまたは少なくとも命令セットに固有のものです。したがって、通常は行われません。
次のレベルの抽象化は、(いくつかのアセンブリスタイルの疑似コードの)すべての操作を正確にカウントし、個々の操作コスト(クロックサイクル)をパラメーターとして保持することです。このような分析は、とりわけ、Knuthの「The Art of Computer Programming」に見られるため、メモリ階層が存在する場合は困難であり、困難になる傾向がありますが、この種のアプローチの場所は確かにあります。
「クラシック」フレームワークを残して、多くのアルゴリズムはメモリおよび/または通信コストによって支配されるため、その場合、メモリの数とボリュームのカウントはそれぞれにアクセスします。ネットワーク送信は妥当です(そしておそらく十分です)。
さらに、多くの場合、アルゴリズムの絶対的なパフォーマンスではなく、他のアルゴリズムと比較することに関心があることに注意してください。これも、分析されたパラメータの選択を通知する場合があります。
ご覧のとおり、明確な答えはありません。手元の分析の目的に応じて、異なる答えを出すことができます。
いくつかの関連する考えについては、ここでの私の回答と、例としてのQuicksortに関するSebastianの回答も参照してください。