• 締切済み

Perlのアルゴリズムについて教えてください!

データファイルAとデータファイルBからデータを受け取って、データファイルB中の第i番目の文Siの重要度を式1に基づいて計算して、重要度と順位(重要度の高い順に1位、2位、、)を各文Siに付与するアルゴリズムを考える場合、式1のWi,jは文Siに出現するj番目の単語で、niはSiに出現する単語の数となる。Wi,jの出現頻度はファイルAから得られるものとする。 /*データファイルA*/ はじめ:␣12 改行 こる:␣1 改行 いく:␣23 改行 みせ:␣4 改行 ... というように前に文字列(基本形)が入り後ろに数字が記載されているデータ /*データファイルB*/ はじめ␣はじめ␣形容詞 改行 こる␣こる␣形容詞 改行 ... EOS 改行 ... ␣は空文字 1.ファイルAにまだ読み込んでいない行がある限り繰り返す    1-1.ファイルから一行読み込む    1-2.その行の基本形用のカウンタを用意して、そのカウンタにその基本形の出現頻度を代入する。 2.文番号カウンタと文重要度変数を用意して、初期値をそれぞれ1と0にする。 3.データファイルBにまだ読み込んでいない行がある限り繰り返す 3-1.ファイルから1行読み込む 3-2.もしその行がEOSであれば、文番号カウンタと文重要度変数の値を出力する。その後、文重要度変数を0にして、文番号カウンタを1増やす。 3-3.これ以降のアルゴリズムが解けないので教えてください。

この投稿のマルチメディアは削除されているためご覧いただけません。
  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

学校の課題か、それとも企業の研修とかでしょうか。学校だったら、ばれたら卒業できないんじゃないでしょうかね?時すでに遅しかもしれませんが。 Perlで良い問題を出す先生がいてうれしいです。学生はアレかもしれないですけど。

関連するQ&A

  • perlの内容なのですがこれで合っていますでしょうか?

    print 関数は文字列や数値だけでなく、変数を指定してその値を表示することもできます。 $a=1; 1を$aに代入する。 print $a; 変数$aの値を表示させる。 $a=2; 変数$aに2を代入する。 $b=3; 変数$bに3を代入する。 print "変数\$aに変数\$bを代入\n"; 「変数$aに変数$bを代入」という文字を表示させて改行する。 $a=$b; 変数$bの値を変数$aに代入する。 print "\$a="; 「$a=」を表示させる。 print $a; 変数$aの値を表示させる。 print ",\$b="; 「,$b=」を表示させる。 print $b; 変数$bの値を表示させる。 print "\n"; 改行を表示させる。 実行結果は↓↓↓↓↓↓↓ 変数$aに変数$bを代入 $a=3,$b=3 変数の書き方 文は ; で区切るが、1行に並べることも可能。 $a=2; $b=3; ↓ $a=2; $b=3; 複数の変数に、同時に値を代入することも可能。 $a=2; $b=2; ↓ $a=$b=2;

    • ベストアンサー
    • Perl
  • perlのpushについてです。

    お世話になります。perlのpushについてです。 データファイルを読み@XXに入れます。 実際はもうちょっと複雑なのですが、 foreach $DATA (@XX){$CHECK=''; ($A,$B)=split(/\,/$DATA); # $Bには改行コードを含んでいます。 if ($A==1){$A=2;$CHECK=1;} if ($A==2){$A=3;$CHECK=1;} if ($A==3 and $B==1){$A=1;$B=9;$CHECK=1;} if ($CHECK==1){ push(@N,"$A,$B");}else{ push(@N,"$DATA"9;} } として、@Nをファイルに出力すると1行目を除き、 行の先頭になぜか空白が付いてしまいます。 別のスクリプトで読むときに数字以外は削除というような 文を加えても削除できず、 if ( $A eq '1'){・・・・ としたときにマッチしてくれません。 よって、この最初にファイルに書き出す際に空白が付かないように したいのですが、何故付いてしまうのか?、回避方法は? ご指導頂けたら幸いです。 付いてしまいます。

    • ベストアンサー
    • Perl
  • Perlを使った単語頻度プログラム

    ファイル1には 英文 I will go by car to the airport. I bought prior to boarding a plane to and snacks. //改行 Upon arrival at Los Angeles International Airport, was not able to go to the local tourist hit by heavy rain. ... のように英文が数十行記載されています。 ファイル2には Car car level1 Airplane airplane level1   Snacks  snacks level2 ... EOS Upon upon level3 ... というように、第一引数に単語、第二引数に小文字の単語、最後にレベル(あまり意味をなさない・・・)が記載されているとします。EOSは改行です。 ファイル3には car : 3 airplane : 1 snacks : 1 というように予めファイル1の中での各単語の出現回数をカウントしたテキストとなります。 この三つのファイルをもとに、 まずファイル2を読み込んでファイル2内の第二引数とファイル3の単語で同じものがあれば、カウント変数に出現回数(ファイル3内の数値)を加算することを繰り返し、それをEOSの行になるまで繰り返し、ファイル1での該当の行と、EOSまでの出現回数を出力し、その都度、出現回数の多い順に文をソートするプログラムを教えてください。 結果例 1 :  123  : I will go by car to the airport. I bought prior to boarding a plane to and snacks. 順位:出現回数:文

    • ベストアンサー
    • Perl
  • かけ算に関してのアルゴリズム

    アルゴリズムに関して全くの初心者なので、お力を貸してくれると幸いです。 タイトルにもありますが、かけ算を使ってのアルゴリズムですが、足し算なり、引き算なりを使ったほうが効率がいいのですが、どのようにすればいいのか悩んでおります。 x=a*b-c*c+bd y=b*b-cc+a*d と全部で6つののかけ算があります。 新しい変数(例えば、temp=c*c のような)を作ってもかまいませんので、 かけ算の使用回数を3回までに押さえたいのです。 私が考えたのは、 x=b(a+d)-temp y=b(b+a)-temp+a(d-b) ほかに効率の良いアルゴリズムはありますでしょうか? よろしくお願いします

  • Perlで行をさかのぼって削除する方法を教えて下さい

    ActivePerl5.8.4にて、以下の規則に従い、テキストファイルから複数行を削除しようとしています。 ・1つの行はアルファベットと数字から成っており、アルファベットはA,B,Cの順に出現する。A,B,Cの行で一かたまり。 ・数字部分が全く同じかたまりが出現すると、後で出現したかたまりを削除する。 ・数字部分が全く同じかたまりが出現するときは、必ず連続で出現する。 下のような感じです。(スペースの都合で「\n」をつけましたが、実際には改行までが1行に書かれているテキストファイルを読み込みます。) 【入力】 A 1\nB 2\nC 3\nA 1\nB 2\nC 3\nA 1\nB 2\nC 2[EOF] 【出力】 A 1\nB 2\nC 3\nA 1\nB 2\nC 2[EOF] すぐに思いついた方法はこんな感じです(まだ勉強不足のため、コードではあらわせません)。  1.ファイルの1行ずつ読み込む  2.A,B,Cをキーにして数字をハッシュに格納  3.2回目のCまで読み込んだところで1つ前のハッシュと比較  4.AからCの数字がすべて同じだった場合に、現在の行(2つめのCを読み込んでいる)とその前2行を削除(実際にはnextでprintを飛ばす) ところが、4の、さかのぼって行を削除する方法が思いつきません。 なにぶんperlの勉強を始めたばかりで突っ込み所満載のロジックだとは思いますが、解決策をぜひご教示ください。

    • ベストアンサー
    • Perl
  • アルゴリズムの2-3-4木

    アルゴリズムの2-3-4木 アルゴリズムの平衡木の一種である2-3-4木を使い、テキストファイルに書かれている文中の英単語1文字1文字を挿入し(同じ単語は1度だけ)、全ての単語の配置(パラグラフ、行数)を表示するというプログラムを考えているのですが、どのように組めばいいのかがわかりません。 例えばテキストファイルの文中に、studyという単語が1つ目のパラグラフの2行目、2つ目のパラグラフの4行目にあれば、 study (1,2) (2,4) と表示するプログラムです。2-3-4木ではどのようにデータを格納していくかはわかったのですが、データの挿入やノードの分割などをプログラムではどのように書けばいいのでしょうか。 どなたかご教授お願いいたします。

  • perlでのSTDINについて

    最近、perlを独学で勉強し始めたものです。 1行で複数回データの入力を行いたいのですが、データを入力するたびに改行されてしまいます。 今は$変数=<STDIN>としているのですが、STDINで取得したデータには\nが含まれているようなので、chompを使うのかと考えているのですがどうしたらいいのか分かりません。それとも何か別の方法があるのでしょうか?

    • ベストアンサー
    • Perl
  • エクセルVBAについて質問です。

    現在、マクロで重複データを削除する処理しています。 一応動作はするのですが、すごく遅いです。 およそ私のPC(XPのQuadコア)で1行処理するのに約0.85秒かかっています。 データが1万行以上もあるようなときは、何時間もかかってしまいます。 エクセルのデータは、以下のように、 A列とB列に文字列が何行にも渡って入っているものです。 A列   B列 AAA BBB CCC DDD EEE FFF GGG BBB CCC HHH CCC DDD (以下同様) 上のようなシートで、A列とB列の両方について重複する行を削除したいと思っています。 上記例だと、一番最後の「CCC-DDD」の箇所を削除したいです。 そこで以下のようなマクロを組みました。 (1)はじめに重複をチェックする変数(A列・B列)を取得します。 (2)上から順にチェックを開始します。 (3)A列・B列双方が取得した変数と一緒なら重複カウンターに1を加える。 (1回目の出現では削除しない) (4)チェックを続け、重複カウンターが2以上になった行は削除する。 (5)上記を空白行まで繰り返す。 というような流れです。 (マクロ記述の途中部分からです) '重複する行を削除 counter3 = 1 Do search_word1 = Cells(counter3, 1).Value search_word2 = Cells(counter3, 2).Value counter4 = 1 double_counter = 0 Do If Cells(counter4, 1).Value = search_word1 And Cells(counter4, 2).Value = search_word2 Then double_counter = double_counter + 1 If double_counter > 1 Then '二度以上出現した場合から削除する Cells(counter4, 1).EntireRow.Delete counter4 = counter4 - 1 End If End If counter4 = counter4 + 1 Loop Until Cells(counter4, 1).Value = "" counter3 = counter3 + 1 Loop Until Cells(counter3, 1) = "" 初心者なのもので、冗長や不適切な箇所などあるかと思います。 より効率的、あるいは、より早くできる書き方がありましたら、 ぜひともお教え下さい・よろしくお願いします。

  • Perlについて教えてください!

    入力ファイルには AAA␣aaa␣AaAa 改行 BBB␣bAb␣BbBb 改行 CCC␣Abc␣CcCc 改行 DDD␣.... というように文字列がスペースおきに3つ記載されていて最後は改行されている文が複数行ある場合、 文の2つ目のaaa、bAb、Abc…のみを配列に格納したい場合のプログラムを教えてください。

    • ベストアンサー
    • Perl
  • アルゴリズム

    アルゴリズムの勉強をしていて、時間計算量に関する問題があり、解いたのですが、解答が載ってなく困ってます。正誤の判断と、もし間違っているなら、何が間違っているのかを教えて頂けると助かります。 ある問題において、大きさ(データ量)nに対して、アルゴリズムA、B、Cの時間計算量が、それぞれn、n^2(nの2乗)、2^n(2のn乗)であるとする。 (1)アルゴリズムAを用いて10秒間にn=100の問題が解けた。20秒かけるとき扱える問題の大きさnの値を求めよ。 解) n=100*2 =200 (2)ある計算機を用いてアルゴリズムBで10秒間にn=100の問題が解けた。100倍早い計算機を用いたとき、10秒間に扱える問題の大きさを求めよ。 解) 求める問題の大きさをxとおくと n=(100^2)*100 =10000*100 =1000000 (3)アルゴリズムCを用いて1時間にn=20の問題が解けた。n=40の問題を解くのに何時間かかるか。 解) 2^40=(2^20)*(2^20) =1*(2^20) =2^20[時間]

専門家に質問してみよう