我總是喜歡嘗試和點認爲解決方案的正確性總是優先於其工作速度。某些不起作用但速度很快的問題與某些可行的問題一樣多,但速度很慢。
所以我將分別解決解決方案的正確性和效率問題。
正確性
結合array_map()
的explode()
和trim()
相結合,很好地工作在這裏實現自己的預期目標。
$cityNamesArray = array_map('trim', explode(',', $cityNames));
您也可以在這裏輸入array_filter()
以確保零長度字符串不會通過。所以在像"Chicago, San Diego, El Paso,, New York,"
這樣的字符串中,你不會得到一些空值的數組。
$cityNamesArray = array_filter(array_map('trim', explode(',', $cityNames)), 'strlen');
這假定數據可以不一致和斷開生產具有所期望的最終結果產生不利影響。所以解決方案的正確性就是這種效果。
的功能相結合,調用此導致數組反覆幾次,所以你有O(n * 2 + k)
時間,其中k
是字符串中的字符數,以尋求劃界和n
是通過array_map
並通過所得數組中元素的個數array_filter
。
速度
我們思考如何使其更快,我們需要得到大O下跌接近O(k)
對於最優化的解決方案,因爲你不能用單個字符針減少k
任何進一步/乾草堆子串搜索。
的preg_split('/\s*,\s*/', $cityNames, -1, PREG_SPLIT_NO_EMPTY)
方法具有約O(k)
時間複雜度,因爲它是不太可能超過O(k + 1)
或最壞的情況下,如果O(k + log k)
比在PCRE VM單次多。
它也適用於上述情況,其中$cityNames = "Chicago, San Diego, El Paso,, New York,"
或類似的結果。
這意味着它符合正確性和效率的標準。因此我會說這是最佳解決方案。
臺標
雖這麼說,我想你會發現這兩種方法之間的性能差異是相當微不足道。
下面是一個基本的基準標記,用於說明差異對平均輸入的影響可以忽略不計。
$cityNames = "Chicago, San Diego,El Paso,,New York, ,"; // sample data
$T = 0; // total time spent
for($n = 0; $n < 10000; $n++) {
$t = microtime(true); // start time
preg_split('/\s*,\s*/', $cityNames, -1, PREG_SPLIT_NO_EMPTY);
$t = microtime(true) - $t; // end time
$T += $t; // aggregate time
}
printf("preg_split took %.06f seconds on average", $T/$n);
$T = 0; // total time spent
for($n = 0; $n < 10000; $n++) {
$t = microtime(true); // start time
array_filter(array_map('trim', explode(',', $cityNames)), 'strlen');
$t = microtime(true) - $t; // end time
$T += $t; // aggregate time
}
printf("array functions took %.06f seconds on average", $T/$n);
preg_split took 0.000003 seconds on average
array functions took 0.000005 seconds on average
這是它們之間也許1或2微秒的平均差異。當測量這種微小的速度差異時,只要解決方案能夠產生正確性,你就不必太在意。解決性能問題的更好方法是按照數量級進行衡量。速度爲1微秒或2微秒的解決方案不值得探索,如果花費更多的時間來開展工作,而不是僅僅使用現有的解決方案,即幾乎一樣快,但同樣正確。然而,一種可以快1到2個數量級的解決方案可能是。
如果你經常這樣做,最好只創建一次數組。然後存儲數組varraible而不是字符串 – nogad
在我的情況下,昏迷分隔列表是由用戶使用textarea提供的。 – Syed
奇怪的用戶輸入,但你可能應該考慮他們可能會把它弄亂了額外的空間或(任何) – nogad