當前位置:首頁 » 操作系統 » 安卓的演算法

安卓的演算法

發布時間: 2022-05-25 00:55:58

安卓系統單機版的貪吃蛇核心演算法和技術

《貪吃蛇》的最簡演算法就是用鏈表了
用鏈表的節點表示蛇
增加的減少都有很方便
移動的時候只須增加一個頭節點並去掉尾節點就行了
吃食物是只須增加一個頭節點
鏈表和蛇本來就很相似
用鏈表編《貪吃蛇》最合適不過了
網上有很多這種《貪吃蛇》的代碼,可以下載來直接使用

② android加密演算法有哪些

android中用的到加密:

  1. Https編程 :應該是使用帶安全的網路協議處理。除非你本地需要加密

2.數據簽名:混淆代碼和防二次打包的APK加密技術

3.對稱加密:可以先將數據通過某種加密方式加密發送到伺服器端,然後伺服器端再解密 ,項目中除了登陸,支付等介面採用rsa非對稱加密,之外的採用aes對稱加密

4.非對稱加密====支付寶

數字摘要是指通過演算法將長數據變為短數據,通常用來標識數據的唯一性,是否被修改,常用的加密演算法有md5和sha1兩種,如Android的App簽名也是用的這兩種演算法。

由於以上兩種生成數字摘要的演算法都是不可逆的,對於可逆的加密演算法中,按照密鑰的數量和加密規則一半分為對稱加密和非對稱加密兩類:

對稱加密:

密鑰可以自己指定,只有一把密鑰,如果密鑰泄漏數據就會暴漏;

常用的對稱加密演算法有DES和AES兩種;

特點是加密速度快,但是缺點是安全性低,因為只要密鑰暴漏,數據就可以被解密。

非對稱加密的特點:

常見的非對稱加密演算法是RSA;

他有兩把密鑰,且是由程序生成的,不能自己指定;

特點是加密速度比較慢,但是安全性比較高;

加密和解密的規則是:公鑰加密只能私鑰解密,私鑰加密只能公鑰解密;

③ android源碼里有哪些比較好的演算法或框架推薦

Android中對於圖形界面以及多媒體的相關操作比較容易實現。而且對於大多數
手機
用戶來說,他們主要也就是根據這些方面的功能來對系統那個進行修改。我們可以通過本文介紹的Android多媒體框架的源碼解讀,來具體分析一下這方面的基本知識。
Android多媒體框架的代碼在以下目錄中:external/opencore/。這個目錄是Android多媒體框架的根目錄,其中包含的子目錄如下所示:
* android:這裡面是一個上層的庫,它基於PVPlayer和PVAuthor的SDK實現了一個為Android使用的Player和Author。
* baselibs:包含數據結構和線程安全等內容的底層庫
* codecs_v2:這是一個內容較多的庫,主要包含編解碼的實現,以及一個OpenMAX的實現
* engines:包含PVPlayer和PVAuthor引擎的實現
* extern_libs_v2:包含了khronos的OpenMAX的頭文件
* fileformats:文件格式的據具體解析(parser)類
* nodes:編解碼和文件解析的各個node類。
* oscl:操作系統兼容庫
* pvmi: 輸入輸出控制的抽象介面
* protocols:主要是與網路相關的RTSP、RTP、HTTP等協議的相關內容
* pvcommon:pvcommon庫文件的Android.mk文件,沒有源文件。
* pvplayer:pvplayer庫文件的Android.mk文件,沒有源文件。
* pvauthor:pvauthor庫文件的Android.mk文件,沒有源文件。
* tools_v2:編譯工具以及一些可注冊的模塊。
Splitter的定義與初始化
以wav的splitter為例,在fileformats目錄下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目錄下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。
我們由底往上看,vwavfileparser.cpp中的PV_Wav_Parser類有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成員函數,此類應該就是最終的解析類。我們搜索PV_Wav_Parser類被用到的地方可知,在PVMFWAVFFParserNode類中有PV_Wav_Parser的一個指針成員變數。
再搜索可知,PVMFWAVFFParserNode類是通過PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成員函數生成的。而CreatePVMFWAVFFParserNode()函數是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()類構造函數中通過PVPlayerNodeInfo類被注冊到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> 的vector中,在這個構造函數中,AMR,mp3等node也是同樣被注冊的。
由上可知,Android多媒體框架中對splitter的管理也是與ffmpeg等類似,都是在框架的初始化時注冊的,只不過Opencore注冊的是每個splitter的factory函數。
綜述一下splitter的定義與初始化過程:
每個splitter都在fileformats目錄下有個對應的子目錄,其下有各自的解析類。
每個splitter都在nodes目錄下有關對應的子目錄,其下有各自的統一介面的node類和node factory類。
播放引擎PVPlayerEngine類中有PVPlayerNodeRegistry iPlayerNodeRegistry成員變數。
在PVPlayerNodeRegistry的構造函數中,將 AMR, AAC, MP3等splitter的輸入與輸出類型標示和node factory類中的create node與release delete介面通過PVPlayerNodeInfo類push到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> iType成員變數中。
當前Splitter的匹配過程
PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids)函數的功能是根據輸入類型和輸出類型,在已注冊的node vector中尋找是否有匹配的node,有的話傳回其唯一識別標識PVUuid。
從QueryRegistry這個函數至底向上搜索可得到,在android中splitter的匹配過程如下:
android_media_MediaPlayer.cpp之中定義了一個JNINativeMethod(java本地調用方法)類型的數組gMethods,供java代碼中調用MultiPlayer類的setDataSource成員函數時找到對應的c++函數
1.{"setDataSource", "(Ljava/lang/String;)V", (void *)
android_media_MediaPlayer_setDataSource},
2.static void android_media_MediaPlayer_setDataSource
(JNIEnv *env, jobject thiz, jstring path)
此函數中先得到當前的MediaPlayer實例,然後調用其setDataSource函數,傳入路徑
3.status_t MediaPlayer::setDataSource(const char *url)
此函數通過調getMediaPlayerService()先得到當前的MediaPlayerService, const sp<IMediaPlayerService>& service(getMediaPlayerService());
然後新建一個IMediaPlayer變數, sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));
在sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url)中
調status_t MediaPlayerService::Client::setDataSource(const char *url)函數,Client是MediaPlayerService的一個內部類。
在MediaPlayerService::Client::setDataSource中,調sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType)
生成一個繼承自MediaPlayerBase的PVPlayer實例。

④ android聯系人排序用了什麼演算法

今天用了整整一下午去搗鼓這塊,為什麼模擬器上可以按拼音排序,中英文混排,及按字母搜索聯系人,但到了開發板(平台是根據android2.2改過的)上就怎麼不行了呢,雖然現在還沒有解決,但也是知道了問題所在,離解決之路也就不遠了
好吧,現在就解釋下android2.2是怎麼按拼音排序的。

首先我們來看下android.2自帶通訊錄的資料庫文件contacts2.db的raw_contacts表。用sqlitedbviewer工具打開後可以看到有這么一個欄位:sort_key(sort_key_alt與之相似,只不過是英文環境下有個按given name還是first name排序的問題)。

正常狀況下,我們新建一個聯系人的話,如果是英文,則sort_key與display_name欄位顯示相同,如果輸入姓名是中文,如「你好」,sort_key則會顯示「ni 你 hao 好」,這樣開發者既可以根據此欄位按拼音排序,中英文混排,以及按拼音搜索聯系人拉。

現在就說下,android是如何將中文名的聯系人轉化為拼音存到sort_key裡面的:

view plain to clipboardprint?
if (displayNameStyle == FullNameStyle.CHINESE ||
displayNameStyle == FullNameStyle.CJK) {
sortKeyPrimary = sortKeyAlternative =
ContactLocaleUtils.getIntanc).getSortKe(displayNamePrimary, displayNameStyle);}
if (displayNameStyle == FullNameStyle.CHINESE ||
displayNameStyle == FullNameStyle.CJK) { sortKeyPrimary =
sortKeyAlternative =
ContactLocaleUtils.getIntanc).getSortKe(displayNamePrimary,
displayNameStyle);}
這段代碼是運行在contactsprovi2.Java的updateRawContactDisplayName()方法裡面,這段代碼我們用到了ContactLocaleUtils.java這個類,所以我們進入它以後最顯眼的就是ChineseContactUtils這個ContactLocaleUtils的子類,它重寫了ContactLocaleUtils的getSortKey()方法,如下:

view plain to clipboardprint?
public String getSortKey(String displayName) {

ArrayList tokens = HanziToPinyin.getInstance().get(displayName);

if (tokens != null && tokens.size() > 0) {

StringBuilder sb = new StringBuilder();

for (Token token : tokens) {

// Put Chinese character's pinyin, then proceed with the

// character itself.

if (Token.PINYIN == token.type) {

if (sb.length() > 0) {

sb.append(' ');

}

sb.append(token.target);

sb.append(' ');

sb.append(token.source);

} else {

if (sb.length() > 0) {

sb.append(' ');

}

sb.append(token.source);

}

}

return sb.toString();

}

return super.getSortKey(displayName);

}
public
String getSortKey(String displayName) {
ArrayList tokens =
HanziToPinyin.getInstance().get(displayName); if (tokens !=
null && tokens.size() > 0) { StringBuilder
sb = new StringBuilder(); for (Token token : tokens) {
// Put Chinese character's pinyin, then proceed
with the // character itself.
if (Token.PINYIN == token.type) { if
(sb.length() > 0) { sb.append(' ');
} sb.append(token.target);
sb.append(' ');
sb.append(token.source); } else {
if (sb.length() > 0) {
sb.append(' '); }
sb.append(token.source); } }
return sb.toString(); } return
super.getSortKey(displayName); }
首先我們看 ArrayList tokens = HanziToPinyin.getInstance().get(displayName);,因為其他的無非就是插入格式的問題,我們暫時不用看。

android如何將漢字轉為拼音的?這就用到了HanziToPinyin這個類,好吧,我們先看下HanziToPinyin的getInstance()方法:

view plain to clipboardprint?
public static HanziToPinyin getInstance() {

synchronized(HanziToPinyin.class) {

if (sInstance != null) {

return sInstance;

}

// Check if zh_CN collation data is available

final Locale locale[] = Collator.getAvailableLocales();

for (int i = 0; i < locale.length; i++) {

if (locale[i].equals(Locale.CHINA)) {

sInstance = new HanziToPinyin(true);

return sInstance;

}

}

Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");

sInstance = new HanziToPinyin(false);

return sInstance;

}

}
public static HanziToPinyin getInstance() {
synchronized(HanziToPinyin.class) { if (sInstance != null) {
return sInstance; } // Check
if zh_CN collation data is available final Locale locale[]
= Collator.getAvailableLocales(); for (int i = 0; i <
locale.length; i++) { if
(locale[i].equals(Locale.CHINA)) { sInstance = new
HanziToPinyin(true); return sInstance;
} } Log.w(TAG, "There is no Chinese
collator, HanziToPinyin is disabled"); sInstance = new
HanziToPinyin(false); return sInstance; } }
現在說下我的開發板為什麼不能轉拼音;就是因為final Locale locale[] = Collator.getAvailableLocales()的Locale沒有一項equals(Locale.CHINA),所以到時候解決了這項,聯系人的按拼音排序也就解決了,如果大家不想用系統自帶的,自己可以下載個pinyin4j.jar包自己實現吧。

好吧,繼續:

看方法名也只到,這個方法返回一個HanziToPinyin實例,我仔細研究了HanziToPinyin的構造方法,無論純如的布爾值是false還是true都不影響,返回的都一樣,只不過這個方法的Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");可以提示是否支持漢字轉拼音,如果不能,android就會將displayname原封不動的插入sort_key裡面,如果能,就是剛才我說的 如「你好」,sort_key則會顯示「ni 你 hao 好」,這種形式,具體的如何轉拼音就是get()方法拉,直接插代碼:

view plain to clipboardprint?
public ArrayList get(final String input) {
ArrayList tokens = new ArrayList();
if (!mHasChinaCollator || TextUtils.isEmpty(input)) {
// return empty tokens.
return tokens;
}
final int inputLength = input.length();
final StringBuilder sb = new StringBuilder();
int tokenType = Token.LATIN;
// Go through the input, create a new token when
// a. Token type changed
// b. Get the Pinyin of current charater.
// c. current character is space.
for (int i = 0; i < inputLength; i++) {
final char character = input.charAt(i);
if (character == ' ') {
if (sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
} else if (character < 256) {
if (tokenType != Token.LATIN && sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokenType = Token.LATIN;
sb.append(character);
} else if (character < FIRST_UNIHAN) {
if (tokenType != Token.UNKNOWN && sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokenType = Token.UNKNOWN;
sb.append(character);
} else {
Token t = getToken(character);
if (t.type == Token.PINYIN) {
if (sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokens.add(t);
tokenType = Token.PINYIN;
} else {
if (tokenType != t.type && sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokenType = t.type;
sb.append(character);
}
}
}
if (sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
return tokens;
}

⑤ 安卓cpu優化tcp擁塞演算法cubic和reno怎麼選擇

  1. 上述具體的論文可以參考:CUBIC: A New TCP-Friendly High-Speed TCP Variant

  2. 1. tcp cubic數學模型

  3. CUBIC在設計上簡化了BIC-TCP的窗口調整演算法,在BIC-TCP的窗口調整中會出現一個凹和凸(這里的凹和凸指的是數學意義上的凹和凸,凹函數/凸函數)的增長曲線,CUBIC使用了一個三次函數(即一個立方函數),在三次函數曲線中同樣存在一個凹和凸的部分,該曲線形狀和BIC-TCP的曲線圖十分相似,於是該部分取代BIC-TCP的增長曲線。另外,CUBIC中最關鍵的點在於它的窗口增長函數僅僅取決於連續的兩次擁塞事件的時間間隔值,從而窗口增長完全獨立於網路的時延RTT,之前講述過的HSTCP存在嚴重的RTT不公平性,而CUBIC的RTT獨立性質使得CUBIC能夠在多條共享瓶頸鏈路的TCP連接之間保持良好的RRTT公平性。

  4. 來看下具體細節:當某次擁塞事件發生時,Wmax設置為此時發生擁塞時的窗口值,然後把窗口進行乘法減小,乘法減小因子設為β,當從快速恢復階段退出然後進入到擁塞避免階段,此時CUBIC的窗口增長開始按照「凹」式增長曲線進行增長,該過程一直持續直到窗口再次增長到Wmax,緊接著,該函數轉入「凸」式增長階段。該方式的增長可以使得窗口一直維持在Wmax附近,從而可以達到網路帶寬的高利用率和協議本身的穩定性。

  5. 窗口的增長函數如下:

  6. W(t)=C*(t-K)3+Wmax,其中C和β為常量。

  7. t為當前時間距上一次窗口減小的時間差,而K就代表該函數從W增長到Wmax的時間周期,。

  8. 當收到ACK後,CUBIC計算利用該演算法計算下一個RTT內的窗口增長速度,即計算W(t+RTT),該值將作為cwnd的目標值,根據cwnd的大小,CUBIC將進入三種不同模式,如果cwnd會小於在標准TCP下經過上次擁塞之後的時刻t窗口將會達到的值(該值是通過標准TCP的窗口增長函數計算出來的),那麼CUBIC就處於標准TCP模式,如果小於Wmax,那麼位於凹階段的,如果大於Wmax,那麼處於凸階段。

  9. tcp cubic 內核源代碼調用邏輯

  10. CUBIC整體架構調用的邏輯如下:

  11. 1. 連接每收到一個ack,則調用tcp_ack

  12. 2. tcp_ack會調用bictcp_acked,用來更新cnt和delayed_ack(用來消除delay包的影響)

  13. 3. tcp_ack會調用bictcp_cong_avoid,這是分兩種情況:

  14. (1)snd_cwnd小於慢啟動閾值,處於慢啟動階段,則調用tcp_slow_start

  15. (2)snd_cwnd大於慢啟動閾值,處於擁塞避免階段,則調用bictcp_update來更新bictcp,再調用tcp_cong_avoid_ai

  16. 4. tcp_ack中如果檢測到丟包,進入擁塞處理階段,則調用bictcp_recalc_ssthresh來更新慢啟動閾值

  17. 5. tcp_ack中完成丟包重傳後,退出擁塞處理階段,則調用bictcp_undo_cwnd來更新

  18. 快速重傳:tcp_ack中的丟包檢測,即檢測到連續3個重復ACK。

  19. 快速恢復:bictcp_undo_cwnd,直接把snd_cwnd更新為max(snd_cwnd,last_max_cwnd),和掉包前相差不大。

⑥ 安卓開發:求24點演算法程序: 1,5,5,5 要求得到 5*(5-1/5)=24 等

這個24點演算法其實類似於 你去枚舉出所有的演算法;大概有這么幾種

1。最常見的演算法是
3*8,4*6,2*12,所以最先考慮的應該是上述3種演算法。一般情況已有其中的一個因子,而用其他3個數去另一個因子。

2。先乘後加。
常見的有2*7+10,3*5+9,2*9+6,3*7+3。

3。先乘後減。
常見的有3*9-3,4*7-4,5*6-6。這種類型里較難的是減數是由兩個數相加而得,例如:2、5、7、9。

4。消去。
有 時候,3個數就可以算出24,多出來一個數,用消去法,可將多餘的數除去。如3、5、9、10,3*5+9=24,多一個10,可將10-5=5,將10 消去。用乘法的分配律消去,如2,5,8,8,(5-2)*8=24,多一個8,可以將算式改為5*8-2*8,將多餘的8消去。

5。會意法。
如4、4、4、4,4*4表示4個4,再加2個4,就是6個4。又如,2、7、8、9,9+7是2個8,再乘於2,變4個8,再減一個8等於3個8。

6。上天法。
先將數乘得很大,最後再除於一個數得24,如10、10、4、4。

7。入地法。
先將數算成分數或小數,最後乘於一個數得24,如3、3、7、7。

8。化除為乘法。
用一數除於一個分數,相當於乘與一個數,最後得24。如3、3、8、8。

無論何種語言,都離不開這8種情況

⑦ android方面的一些演算法和數據結構用什麼語言寫呢C還是java

演算法是通用的獨立於語言的。 安卓底層是c寫的,給出的api是java的。安裝的開發官方語言就是java

⑧ android 面試,演算法題。

final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}

不知道你是不是這個意思。

⑨ 安卓開發對演算法的要求高嗎

主要看你開發什麼項目,如果只是信息類的,則基本沒演算法要求。一般如果涉及開發游戲、手機安全、查找坐車或查找合理出行路線方案的100%要會演算法才能實現的出來。比如游戲通常會涉及人工智慧演算法,查找坐車路線會涉及非線性結構演算法(如 連通圖,最小成生樹演算法 等)

⑩ 安卓應用市場分類排名演算法一般是怎樣的

按下載量和。用戶量來計算的吧。你的下載量多了。排名肯定就靠前了。因為網民搜索量大。
一般都是按照下載量來計算的,下載量大的排名靠前,反之靠後。

熱點內容
h3c如何查看所有配置 發布:2024-05-04 05:26:39 瀏覽:491
java統計字元串中字母個數 發布:2024-05-04 05:22:58 瀏覽:886
throwablejava 發布:2024-05-04 05:22:56 瀏覽:790
IP和伺服器可以分開架設嗎 發布:2024-05-04 05:17:48 瀏覽:26
ip提取源碼 發布:2024-05-04 05:01:42 瀏覽:762
駕校報名了密碼是什麼 發布:2024-05-04 04:49:02 瀏覽:610
安卓加密的rar軟體 發布:2024-05-04 04:18:30 瀏覽:606
聚會編程題 發布:2024-05-04 04:02:41 瀏覽:405
我的世界伺服器自動掃地 發布:2024-05-04 03:48:41 瀏覽:612
4500能配什麼電腦配置 發布:2024-05-04 03:22:29 瀏覽:592