實現演算法
『壹』 在計算機上實現演算法要通過什麼方式
摘要 計算機演算法是以一步接一步的方式來詳細描述計算機如何將輸入轉化為所要求的輸出的過程,或者說演算法是對計算機上執行的計算過程的具體描述。
『貳』 實現演算法:
輸出成文件
C++實現
代碼:
#define_author"Reskip"
#define_CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
usingnamespacestd;
intencode(intx)
{
returnx*x+x*3+5;
}
intmain()
{
stringinput;
cin>>input;
freopen("save.txt","w",stdout);
for(chari:input)
{
cout<<encode(i)<<"";
}
return0;
}
『叄』 計算機的學生到底是實現演算法 還是創造演算法
1、 你這個問題我感覺提的不專業。我感覺你對名詞的概念定義有點混亂。
2、 演算法是一系列解決問題的步驟,可以畫個流程圖出來,分為偽代碼的定義描述 和真代碼的實現。
3、 如果你是志在創造演算法,青史留名的話(比如什麼逆波蘭,迪克斯特拉演算法什麼的),我想你應該讀到博士。做個真正的計算機科學家,努力發表幾篇論文,這樣對你青史留名可能會有幫助。
4、我個人認為,為了就業的話,理解現有數據結構和演算法的代碼實現,並且做到工程化應用,企業的工程項目上面不提倡重復造輪子,一般是拿來主義,看懂別人的輪子,會拆除,會重組輪子,是最重要的。
『肆』 演算法實現
多看一些源代碼最好,先動手編一些簡單的程序,程序能力的提高都是靠看靠編出來的,理論不用很到位的面面具到的都非常懂會用最好,遇到問題會查閱資料。參考書籍的話:c就是譚浩強那本比較經典了,外國書是好但看起來費勁。c++就清華的潛能也不錯。你直接學《數據結構和演算法分析設計》這門課不太合理,因為得有一些基礎和編程經驗在學會更好一些。
多去csdn學習,多尋找一些好的源代碼看看。這樣學起來很快而且不枯燥,如果一味得看書你會煩得不行也沒有盡頭,邊學邊練習會極大增強信心。
『伍』 編寫程序實現演算法
#include <stdio.h>
#define false 0
#define true 1
#define maxsize 20typedef struct{
int r[maxsize+1]; //r[0]閑置或用作中轉、哨兵單元
int length;
}sqlist;void Output(sqlist &L)
{
int i;
for(i=1;i<=L.length;i++)
{
printf("%d ",L.r[i]);
}
printf("\n");
}void BubbleSort(sqlist &L) {
int i,j, Exchange;
for (i=1;i<L.length;i++){
Exchange = false;
for (j = 1; j <= L.length-i; j++)
if (L.r[j+1] < L.r[j]) {
L.r[0] =L.r[j];
L.r[j] =L.r[j+1];
L.r[j+1] =L.r[0];
Output(L);
Exchange = true;
}
if (Exchange == false) return;
}
} // BubbleSortint Partition (sqlist &L, int low, int high)
{
int pivotkey;
L.r[0]=L.r[low];
pivotkey=L.r[low];
while(low<high)
{ while(low<high&&L.r[high]>=pivotkey)--high;
L.r[low]=L.r[high];
while(low<high&&L.r[low]<=pivotkey)++low;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QSort (sqlist &L,int low,int high)
{
int pivotloc;
if (low<high)
{pivotloc=Partition(L,low,high);Output(L); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); }
}
int main()
{
sqlist L;
int i;
scanf("%d",&L.length);
for(i=1;i<=L.length;i++)
{
scanf("%d",&L.r[i]);
}
printf("BubbleSort:\n");
BubbleSort(L);
printf("QSort:\n");
QSort(L,1,L.length);
return 0;
}
『陸』 JAVA 實現演算法
編碼是不能用字元串的,大大大降低速度
public class Test{
static public int getIntegerComplement(int n){
return ~n&((1<<(32-Integer.numberOfLeadingZeros(n)))-1);
}
public static void main(String[] args){
int a[]={1,5,50,256,65536};
for(int i:a){
int r=getIntegerComplement(i);
System.out.println(i+" "+Integer.toBinaryString(i)+
" => "+r+" "+Integer.toBinaryString(r));
}
}
}
========
1 1 => 0 0
5 101 => 2 10
50 110010 => 13 1101
256 100000000 => 255 11111111
65536 10000000000000000 => 65535 1111111111111111
『柒』 在演算法實現中,演算法的正確性如何保證
演算法本身的正確性用邏輯推理來證明,和數學定理類似
實現演算法的程序的正確性則是兩碼事
簡單的程序也用邏輯推理來證明,稍復雜的可以用某些專門驗證程序正確性的程序來驗證,再復雜的就沒什麼好辦法了,事實上很多復雜的程序在比較極端的輸入下或多或少都會有點問題
『捌』 實現一個演算法,確定一個字元串的所有字元是否全都不同
實現一個演算法,確定一個字元串的所有字元是否全都不同。假設不允許使用額外的數據結構。
解題:
首先我們假設這個字元串中全都是ASCII字元(如果不是需要另外討論了)。因為ASCII字元集中總共有256個字元,所以我們可以知道如果字元串的長度超過了那麼字元串中肯定有相同的字元。
定義一個bool型大小為256的數組array,然後遍歷輸入的字元串,每遍歷一個字元,令int型變數val等於該字元的的ASCII碼,如果這個字元之前都沒有出現過,那麼令array[val]等於true,如果這個字元之前出現過了,也就是array[val]已經等於true了,就返回false。當字元串中所有字元都遍歷結束後,如果沒有返回false,那麼說明字元串中沒有重復的字元,返回true。
源代碼:
#include<iostream>
#include<string>
using namespace std;
bool ifnosame(string str)//定義一個bool型函數實現演算法
{
if (str.length() > 256)
{
return false;
}
bool array[256];
int val;
for (int i = 0; i < str.length(); i++)
{
val = str[i];
if (array[val] == true)
{
return false;
}
array[val] = true;
}
return true;
}
int main()
{
string s;
cout << "輸入一個字元串,判斷其中所有字元是否全都不同:";
cin >> s;
if (ifnosame(s))
{
cout << "字元串中所有字元全都不同" << endl;
}
else
{
cout << "字元串中所有字元並不是全都不同的" << endl;
}
system("pause");
return true;
}
『玖』 的實現演算法是怎樣的
我們要寫個class,實現如下主程序調用:
static void Main(string[] args)
{
MyHash hash = new MyHash();
hash["A1"] = DateTime.Now;
hash["A2"] = 1;
Console.WriteLine(Convert.ToString(hash["A1"]));
Console.WriteLine(Convert.ToString(hash["A2"]));
}
一看,也確實挺簡單的,就是一個所引器,如下:
class MyHash
{
public object this[string key]
{
get
{
}
set
{
}
}
}
程序中要保存的對象,最終是要保存在一個數組中的,而且需要通過一個轉換函數來進行string key與數組Index的Map,如下:
private List<List<Tuple<string, object>>> lstArray = new List<List<Tuple<string, object>>>(defaultSize);
private int MapString2Int(string key)
{
int hashIndex=0;
char[] keyAry = key.ToCharArray();
foreach (var c in keyAry)
hashIndex += (int)c;
hashIndex = hashIndex % lstArray.Capacity;
return hashIndex;
}
這個函數是遍歷string key的每個char,累加,最終取模(同數組的長度),這樣得出的一個value肯定就在數組范圍內。
如果2個key轉換出來的index相同呢?會導致沖突,一個最簡單的解決辦法是把數組中的每個元素變成List, 也就是說,如果string key轉換後出現了相同的Index,沒關系,只要把那2個元素都放在那個Index所標識的數組位置中即可,本文中用的是List<Tuple<string, object>>。
下面是整個程序的代碼:
class Program
{
static void Main(string[] args)
{
MyHash hash = new MyHash();
hash["A1"] = DateTime.Now;
hash["A2"] = 1;
Console.WriteLine(Convert.ToString(hash["A1"]));
Console.WriteLine(Convert.ToString(hash["A2"]));
}
}
class MyHash
{
private const int defaultSize = 99999;
private List<List<Tuple<string, object>>> lstArray = new List<List<Tuple<string, object>>>(defaultSize);
public MyHash()
{
int i = lstArray.Capacity;
while(i>=0)
{
lstArray.Add(new List<Tuple<string,object>>());
i--;
}
}
public object this[string key]
{
get
{
EnsureNotNull(key);
List<Tuple<string, object>> lst;
Tuple<string, object> obj = FindByKey(key, out lst);
if (obj == null)
throw new Exception("Key不存在");
return obj.Item2;
}
set
{
EnsureNotNull(key);
List<Tuple<string, object>> lst;
Tuple<string, object> obj = FindByKey(key, out lst);
if (obj!=null)
lst.Remove(obj);
lst.Add(new Tuple<string, object>(key, value));
}
}
private Tuple<string, object> FindByKey(string key, out List<Tuple<string, object>> lst)
{
int hashIndex = MapString2Int(key);
lst = lstArray[hashIndex];
Tuple<string, object> obj = null;
for (var i = 0; i < lst.Count; i++)
{
if (lst[i].Item1 == key)
{
obj = lst[i];
break;
}
}
return obj;
}
private static void EnsureNotNull(string key)
{
if (key == null || key.Trim().Length == 0)
throw new Exception("Key不能為空");
}
private int MapString2Int(string key)
{
int hashIndex=0;
char[] keyAry = key.ToCharArray();
foreach (var c in keyAry)
hashIndex += (int)c;
hashIndex = hashIndex % lstArray.Capacity;
Console.WriteLine(string.Format("{0}相應的Index為:{1}", key, hashIndex));
return hashIndex;
}
}
運
『拾』 用web解決數據結構問題怎麼實現演算法
(1)數據結構與演算法的聯系:
程序=演算法+數據結構。數據結構是演算法實現的基礎,演算法總是要依賴於某種數據結構來實現的。往往是在發展一種演算法的時候,構建了適合於這種演算法的數據結構。 演算法的操作對象是數據結構。演算法的設計和選擇要同時結合數據結構,簡單地說數據結構的設計就是選擇存儲方式,如確定問題中的信息是用數組存儲還是用普通的變數存儲或其他更加復雜的數據結構。演算法設計的實質就是對實際問題要處理的數據選擇一種恰當的存儲結構,並在選定的存儲結構上設計一個好的演算法。不同的數據結構的設計將導致差異很大的演算法。數據結構是演算法設計的基礎。用一個形象的比喻來解釋:開採煤礦過程中,煤礦以各種形式深埋於地下。礦體的結構就像相當於計算機領域的數據結構,而煤就相當於一個個數據元素。開採煤礦然後運輸、加工這些「操作」技術就相當於演算法。顯然,如何開采,如何運輸必須考慮到煤礦的存儲(物理)結構,只擁有開采技術而沒有煤礦是沒有任何意義的。演算法設計必須考慮到數據結構,演算法設計是不可能獨立於數據結構的。 另外,數據結構的設計和選擇需要為演算法服務。如果某種數據結構不利於演算法實現它將沒有太大的實際意義。知道某種數據結構的典型操作才能設計出好的演算法。
總之,演算法的設計同時伴有數據結構的設計,兩者都是為最終解決問題服務的。
(2)數據結構與演算法的區別:
數據結構關注的是數據的邏輯結構、存儲結構以及基本操作,而演算法更多的是關注如何在數據結構的基礎上解決實際問題。演算法是編程思想,數據結構則是這些思想的邏輯基礎。