史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2018-03-07, 07:25 PM   #1
alanniok 帥哥
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
Smile 討論 - 尋找/自製 比對數列的方法



--------------------
閱讀本主題的最佳解答
--------------------


最近做專題需要寫一個方法,功能是比對一長串數字和一個小數字段,如果有“相似”的就說有沒有就說沒有
Ex.
數字串= 1, 5, 7, 3, 6, 6, 8, 3, 5, 3, 7, 5, 5.....
那麼輸入------7, 3, 6, 6, 8
或是-----------6, 2, 5, 5, 7
或是--------------------7, 9, 4, 6, 4 都回答有

其他像是1, 5, 5, 3, 6
或是--------6, 8, 4, 4, 5等等就回答沒有

換句話說,與長數字串對比,如果能找到完全相同或是上下平移後能找到完全相同者就回答有,不知道有沒有人見識過類似的方法或是有什麼建議呢??? P.S.我用的是C/C++
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
舊 2018-03-08, 12:10 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設

首先要了解的是
有 與 沒有 的定義

不解~
6, 2, 5, 5, 7
7, 9, 4, 6, 4
為何回答 "有" ?

只有了解 判斷的依據 才能寫出邏輯

=============
如果是用百分比來當 有與沒有 的依據
那簡單
先看你輸入了幾個數字
輸入5個那只要【循序比對】有3個以上就可說"有" (3分之5)
當然也可以不是用【循序比對】當條件 (這又回到問題 看你如何定義了...)

如果是人工智慧的角度
那就不是這麼單純了
必須加上數據分析
人工智慧 與 程式邏輯 的主要差異就是 "數據分析"
人工智慧會有個邏輯判斷 專司 數據的處理
藉由數據的參與、統計 與 修正
讓 人工智慧可以修改輸出邏輯
(目前技術說不上是機器人寫程式,而是機器人拼積木)

當然這個 mini是不會的 ^^"
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
向 mini 送花的會員:
alanniok (2018-03-09)
感謝您發表一篇好文章
舊 2018-03-08, 09:05 PM   #3 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設



過了一些時候
回頭再看一次原來
6, 2, 5, 5, 7 相似 7, 3, 6, 6, 8
7, 9, 4, 6, 4 相似 6, 8, 3, 5, 3

是差距 "1"
那比對方法就是
先算出前後差距
1, 5, 7, 3, 6, 6, 8, 3, 5, 3, 7, 5, 5..... 的前後差距是
-4,-2, 4,-3, 0,-2, 5,-2, 2,-2, 0...

6, 2, 5, 5, 7的前後差距是
4,-3, 0,-2
經過循序比對 符合前面

用C/C++就是
PHP 語法:
int 數列[N]={1573668353755};
int 輸入[4]; //經過輸入後內容是6, 2, 5, 5, 7
int 數列差距[N-1];
int 輸入差距[4-1];

//數列差距
for (int i=0i<Ni++){
   
數列差距[i]=數列[i]-數列[i+1];
}
//輸入差距
for (int i=0i<4i++){
   
輸入差距[i]=輸入[i]-輸入[i+1];
}
//比對開始
for (int i=0i<N-4i++){
   if (
數列差距[i] == 輸入差距[0]){
      
int x=0;
      for (
int j=i+1x<=4j++){
         
x+=1;
         if (
數列差距[j] != 輸入差距[x]){
            break;
         } else if (
== 3) {cout << "相似";}
      }
   }

mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
向 mini 送花的會員:
alanniok (2018-03-09)
感謝您發表一篇好文章
舊 2018-03-09, 07:44 PM   #4 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
預設

這是我後還寫的版本,感覺是可以用,不過方法比較像是暴力解法,之後要用到大量比對的時候猜想可能速度會太慢因此才來問看看有沒有什麼特別的演算法之類。
-------------------------------------------
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
int song[] = {1, 3, 5, 5, 7, 9, 11, 9, 7};// Put the real song fftw result here
int num;
int *a;// used to store fftw of recorded melody

cout << "Enter a number:";
cin >> num;

a = new int[num];

cout << "Please Enter the Number List:";
for(int i =0; i < num; i++)
{
cin >> a[i];
}

int x = a[0];
int yn = 0;
int r[num];
int temp = 0;
for(int i =0; i < num; i++)
{
r[i] = a[i] - x;
}
for(int i =0; i <= sizeof(song)/sizeof(int) - num; i++)
{
for(yn = 0; yn < num; yn++)
{
temp = song[i + yn] - song[i] - r[yn];
if( temp > 1 || temp < -1 )//誤差半音以內沒關係
break;
}
if(yn == num)
break;
}
if(yn == num)
cout << "yes";
else
cout << "no";
return 0;
}

此帖於 2018-03-09 08:13 PM 被 alanniok 編輯.
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
舊 2018-03-11, 04:33 PM   #5 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設

原本看似可以用
陣列與陣列的運算函式來縮減傳統運算的效能
比如
http://webcache.googleusercontent.co...&gbv=1&ct=clnk
但實際上硬要使用那些函式
反而所花的準備時間不會帶來多少時間助益
所以
這可以改良的地方已經微乎其微
充其量可以想辦法使用C++內嵌組合語言來改良

如果效能不彰是指
為了保持作業系統不被所寫的軟體弄得卡卡的
可以"分段"執行
也就是把每N筆資料切割(用副程式方式執行)
這樣可以讓所寫的軟體不會陷入長時間假死(無反應)狀態
當然還有很多種方法避免軟體假死
那就要看你所使用的開發軟體(xxx IDE)是哪套
根據開發軟體可使用 分段、多媒體指令集、多執行緒...等方式
但這就...了 (mini不想太深入 C++)
你可以去研究 多執行緒
原則上使用 強制分段 來達到 每隔一段時間就交出執行權給系統
就已經是個不錯選擇了~
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
向 mini 送花的會員:
alanniok (2018-03-13)
感謝您發表一篇好文章
舊 2018-04-18, 07:45 PM   #6 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
預設 重要!!!發現了很棒的演算法!!!

專題持續進行中,最近翻論文時看到了一個很棒的演算法可以實現我需要的功能,甚至比我想像的還完善,產生的結果不只是Y/N這種二元論,而是0123456這種可以分辨有多像/有多不像。

這個演算法叫做 Minimum Edit Distance Dynamic Programming。

這是我看到的一個步驟說明影片,覺得講得蠻清楚的: https://youtu.be/We3YDTzNXEk
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
向 alanniok 送花的會員:
mini (2018-04-19)
感謝您發表一篇好文章
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 07:41 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1